From 74f8362ea8e53ba0bd5eb608b7a462ecd67d2b61 Mon Sep 17 00:00:00 2001 From: vinicius Date: Mon, 18 Jan 2021 09:50:03 -0300 Subject: [PATCH] Evitando pessimo uso de memoria --- .../src/{Album.java => AlbumFigurinhas.java} | 28 +++-- Album/src/AlbumFigurinhasTest.java | 110 ++++++++++++++++++ Album/src/AlbumTest.java | 104 ----------------- Album/src/Figurinha.java | 8 +- Album/src/Pacotinho.java | 53 --------- Album/src/PacotinhoFigurinhas.java | 47 ++++++++ Album/src/RepositorioFigurinhas.java | 29 +++++ 7 files changed, 212 insertions(+), 167 deletions(-) rename Album/src/{Album.java => AlbumFigurinhas.java} (73%) create mode 100644 Album/src/AlbumFigurinhasTest.java delete mode 100644 Album/src/AlbumTest.java delete mode 100644 Album/src/Pacotinho.java create mode 100644 Album/src/PacotinhoFigurinhas.java create mode 100644 Album/src/RepositorioFigurinhas.java diff --git a/Album/src/Album.java b/Album/src/AlbumFigurinhas.java similarity index 73% rename from Album/src/Album.java rename to Album/src/AlbumFigurinhas.java index 11e277c..80fc719 100644 --- a/Album/src/Album.java +++ b/Album/src/AlbumFigurinhas.java @@ -1,11 +1,13 @@ import java.util.ArrayList; -public class Album { +public class AlbumFigurinhas { public static final int PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR = 90; // 90% private ArrayList figurinhasColadas; + private RepositorioFigurinhas repositorioFigurinhas; + private int contRepetidas[]; private int totalFigurinhasColadas; @@ -16,7 +18,11 @@ public class Album { private int tamanhoDoAlbum; - public Album(int tamanhoDoAlbum, int quantFigurinhasPorPacotinho) { + public AlbumFigurinhas(RepositorioFigurinhas repositorioFigurinhas, int quantFigurinhasPorPacotinho) { + + this.repositorioFigurinhas = repositorioFigurinhas; + this.tamanhoDoAlbum = repositorioFigurinhas.getTamanhoDoAlbum(); + figurinhasColadas = new ArrayList<>(); /* inaugre as posições do ArrayList para que possam ser acessadas diretamente via set() */ @@ -29,12 +35,12 @@ acessadas diretamente via set() */ this.tamanhoDoAlbum = tamanhoDoAlbum; } - public void receberNovoPacotinho(Pacotinho pacotinho) { - for (Figurinha fig : pacotinho) { + public void receberNovoPacotinho(PacotinhoFigurinhas pacotinhoFigurinhas) { + for (Figurinha fig : pacotinhoFigurinhas) { int posicao = fig.getPosicao(); if (figurinhasColadas.get(posicao) == null) { // figurinha inédita! - colarFigurinhaInedita(fig); + colarFigurinhaInedito(fig); } else { // figurinha repetida! contRepetidas[posicao]++; @@ -43,8 +49,8 @@ public void receberNovoPacotinho(Pacotinho pacotinho) { } } - private void colarFigurinhaInedita(Figurinha fig) { - figurinhasColadas.set(fig.getPosicao(), fig); + private void colarFigurinhaInedito(Figurinha figurinha) { + figurinhasColadas.set(figurinha.getPosicao(), figurinha); totalFigurinhasColadas++; } @@ -55,8 +61,8 @@ public void autoCompletar() { this.tamanhoDoAlbum * PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR / 100f) { for (int i = 1; i <= this.tamanhoDoAlbum; i++) { if (this.figurinhasColadas.get(i) == null) { - Figurinha fig = new Figurinha(i); - colarFigurinhaInedita(fig); + Figurinha figurinha = repositorioFigurinhas.obterFigurinhaDoRepositorio(i); + colarFigurinhaInedito(figurinha); } } } @@ -96,4 +102,8 @@ public boolean possuiFigurinhaRepetida(int posicao) { public int getQuantFigurinhasFaltantes() { return this.tamanhoDoAlbum - this.totalFigurinhasColadas; } + + public Figurinha getFigurinhaColada(int posicao) { + return this.figurinhasColadas.get(posicao); + } } diff --git a/Album/src/AlbumFigurinhasTest.java b/Album/src/AlbumFigurinhasTest.java new file mode 100644 index 0000000..e18dcc2 --- /dev/null +++ b/Album/src/AlbumFigurinhasTest.java @@ -0,0 +1,110 @@ +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AlbumFigurinhasTest { + + private AlbumFigurinhas albumFigurinhas; + private RepositorioFigurinhas repositorioFigurinhas; + + private static final int TAMANHO_DO_ALBUM = 200; + private static final int FIGURINHAS_POR_PACOTE = 3; + + @Before // roda antes de cada teste + public void setUp() { + this.repositorioFigurinhas = new RepositorioFigurinhas( + "Repositorio Teste", TAMANHO_DO_ALBUM); + + this.albumFigurinhas = new AlbumFigurinhas(repositorioFigurinhas, FIGURINHAS_POR_PACOTE); + } + + private void popularAlbum(int[] posicoesDesejadas) { + PacotinhoFigurinhas pacote = new PacotinhoFigurinhas( + this.repositorioFigurinhas, posicoesDesejadas); + this.albumFigurinhas.receberNovoPacotinho(pacote); + } + + @Test + public void testarPossuiFigurinhaParaFigurinhasExistentes() { + popularAlbum(new int[] {1, 2, 3}); + + for (int i = 1; i <= FIGURINHAS_POR_PACOTE; i++) { + assertTrue("Figurinhas já inseridas devem ser encontradas", + this.albumFigurinhas.possuiFigurinhaColada(i)); + } + } + + @Test + public void testarPossuiFigurinhaParaFigurinhasAusentes() { + popularAlbum(new int[] {1, 2, 3}); + + assertFalse("Não devemos encontrar no álbum figurinhas nunca inseridas", + this.albumFigurinhas.possuiFigurinhaColada(4)); + assertFalse("Não devemos encontrar figurinhas de posições não-positivas", + this.albumFigurinhas.possuiFigurinhaColada(-390)); + assertFalse("Não devemos encontrar figurinhas maiores do que o tamanho", + this.albumFigurinhas.possuiFigurinhaColada(TAMANHO_DO_ALBUM + 1)); + } + + @Test + public void testarPossuiRepetidaParaFigurinhaRepetida() { + popularAlbum(new int[] {1, 2, 3}); + + assertFalse(this.albumFigurinhas.possuiFigurinhaRepetida(2)); // sanity check + + popularAlbum(new int[] {2, 8, 9}); + assertTrue(this.albumFigurinhas.possuiFigurinhaRepetida(2)); + } + + @Test + public void testarGetTamanhoAlbum() { + assertEquals(TAMANHO_DO_ALBUM, this.albumFigurinhas.getTamanho()); + } + + @Test + public void testarGetContFigurinhas() { + popularAlbum(new int[] {1, 2, 3}); + assertEquals(FIGURINHAS_POR_PACOTE, this.albumFigurinhas.getQuantFigurinhasColadas()); + + // vou agora abrir outro pacotinho com as mesmas figurinhas + // e verificar que o álbum terá ainda 3 figurinhas + + popularAlbum(new int[] {1, 2, 3}); + assertEquals(FIGURINHAS_POR_PACOTE, this.albumFigurinhas.getQuantFigurinhasColadas()); + } + + @Test + public void testarGetQuantasFaltam() { + popularAlbum(new int[] {1, 2, 3}); + assertEquals(TAMANHO_DO_ALBUM - FIGURINHAS_POR_PACOTE, + this.albumFigurinhas.getQuantFigurinhasFaltantes()); + } + + @Test + public void testarAutoCompletar() { + albumFigurinhas.autoCompletar(); + assertEquals("Não deve ser possível auto-completar um álbum que esteja vazio", + TAMANHO_DO_ALBUM, albumFigurinhas.getQuantFigurinhasFaltantes()); + + // agora vamos adicionar pacotinhos aleatório até o álbum ficar quase cheio + + int minimoFigurinhasColadasParaAutoCompletar = + (int) (TAMANHO_DO_ALBUM * AlbumFigurinhas.PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR / 100f); + + while (albumFigurinhas.getQuantFigurinhasColadas() < minimoFigurinhasColadasParaAutoCompletar) { + PacotinhoFigurinhas novoPacotinho = new PacotinhoFigurinhas( + this.repositorioFigurinhas, FIGURINHAS_POR_PACOTE); // aleatório + albumFigurinhas.receberNovoPacotinho(novoPacotinho); + } + + // sanity check + assertTrue(albumFigurinhas.getQuantFigurinhasFaltantes() > 0); + + albumFigurinhas.autoCompletar(); + + assertEquals(0, albumFigurinhas.getQuantFigurinhasFaltantes()); // álbum completo! + + } + +} diff --git a/Album/src/AlbumTest.java b/Album/src/AlbumTest.java deleted file mode 100644 index fc0f6f6..0000000 --- a/Album/src/AlbumTest.java +++ /dev/null @@ -1,104 +0,0 @@ -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - -public class AlbumTest { - - Album album; - - private static final int TAMANHO_DO_ALBUM = 200; - private static final int FIGURINHAS_POR_PACOTE = 3; - - @Before // roda antes de cada teste - public void setUp() { - this.album = new Album(TAMANHO_DO_ALBUM, FIGURINHAS_POR_PACOTE); - } - - private void popularAlbum(int[] posicoesDesejadas) { - Pacotinho pacote = new Pacotinho(this.album, posicoesDesejadas); - this.album.receberNovoPacotinho(pacote); - } - - @Test - public void testarPossuiFigurinhaParaFigurinhasExistentes() { - popularAlbum(new int[] {1, 2, 3}); - - for (int i = 1; i <= FIGURINHAS_POR_PACOTE; i++) { - assertTrue("Figurinhas já inseridas devem ser encontradas", - this.album.possuiFigurinhaColada(i)); - } - } - - @Test - public void testarPossuiFigurinhaParaFigurinhasAusentes() { - popularAlbum(new int[] {1, 2, 3}); - - assertFalse("Não devemos encontrar no álbum figurinhas nunca inseridas", - this.album.possuiFigurinhaColada(4)); - assertFalse("Não devemos encontrar figurinhas de posições não-positivas", - this.album.possuiFigurinhaColada(-390)); - assertFalse("Não devemos encontrar figurinhas maiores do que o tamanho", - this.album.possuiFigurinhaColada(TAMANHO_DO_ALBUM + 1)); - } - - @Test - public void testarPossuiRepetidaParaFigurinhaRepetida() { - popularAlbum(new int[] {1, 2, 3}); - - assertFalse(this.album.possuiFigurinhaRepetida(2)); // sanity check - - popularAlbum(new int[] {2, 8, 9}); - assertTrue(this.album.possuiFigurinhaRepetida(2)); - } - - @Test - public void testarGetTamanhoAlbum() { - assertEquals(TAMANHO_DO_ALBUM, this.album.getTamanho()); - } - - @Test - public void testarGetContFigurinhas() { - popularAlbum(new int[] {1, 2, 3}); - assertEquals(FIGURINHAS_POR_PACOTE, this.album.getQuantFigurinhasColadas()); - - // vou agora abrir outro pacotinho com as mesmas figurinhas - // e verificar que o álbum terá ainda 3 figurinhas - - popularAlbum(new int[] {1, 2, 3}); - assertEquals(FIGURINHAS_POR_PACOTE, this.album.getQuantFigurinhasColadas()); - } - - @Test - public void testarGetQuantasFaltam() { - popularAlbum(new int[] {1, 2, 3}); - assertEquals(TAMANHO_DO_ALBUM - FIGURINHAS_POR_PACOTE, - this.album.getQuantFigurinhasFaltantes()); - } - - @Test - public void testarAutoCompletar() { - album.autoCompletar(); - assertEquals("Não deve ser possível auto-completar um álbum que esteja vazio", - TAMANHO_DO_ALBUM, album.getQuantFigurinhasFaltantes()); - - // agora vamos adicionar pacotinhos aleatório até o álbum ficar quase cheio - - int minimoFigurinhasColadasParaAutoCompletar = - (int) (TAMANHO_DO_ALBUM * Album.PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR / 100f); - - while (album.getQuantFigurinhasColadas() < minimoFigurinhasColadasParaAutoCompletar) { - Pacotinho novoPacotinho = new Pacotinho(this.album); // aleatório - album.receberNovoPacotinho(novoPacotinho); - } - - // sanity check - assertTrue(album.getQuantFigurinhasFaltantes() > 0); - - album.autoCompletar(); - - assertEquals(0, album.getQuantFigurinhasFaltantes()); // álbum completo! - - } - -} diff --git a/Album/src/Figurinha.java b/Album/src/Figurinha.java index 321d64c..2867231 100644 --- a/Album/src/Figurinha.java +++ b/Album/src/Figurinha.java @@ -1,6 +1,12 @@ public class Figurinha { - private int posicao; + private final int posicao; + + private String urlDaImagem; + + private int alturaEmPixels; + + private int larguraEmPixels; public Figurinha(int posicao) { this.posicao = posicao; diff --git a/Album/src/Pacotinho.java b/Album/src/Pacotinho.java deleted file mode 100644 index 0ce2523..0000000 --- a/Album/src/Pacotinho.java +++ /dev/null @@ -1,53 +0,0 @@ -import java.util.ArrayList; -import java.util.Random; - -public class Pacotinho extends ArrayList { - - private Album album; - - private static Random random = new Random(); - - // ToDo atributo que seja uma estrutura para guardar as figurinhas deste pacotinho - - public Pacotinho(Album album) { - this.album = album; - adicionarFigurinhasAleatorias(); - - } - - // sobrecarga no costrutor, passando aqui as posições desejadas - public Pacotinho(Album album, int[] posicoes) { - this.album = album; - - // verificar se o tamanho do array está correto; - if (posicoes.length != album.getQuantFigurinhasPorPacotinho()) { - throw new RuntimeException("Pacotinho no tamanho errado!"); - } - - for (int posicao : posicoes) { - Figurinha fig = new Figurinha(posicao); - add(fig); - } - } - - private void adicionarFigurinhasAleatorias() { - int maxPosicao = album.getTamanho(); - int quantFigurinhasPorPacotinho = album.getQuantFigurinhasPorPacotinho(); - - for (int i = 1; i <= quantFigurinhasPorPacotinho; i++) { - // ToDo sorteia uma posição entre 1 e o tamanho do álbum - int posicao = 1 + random.nextInt(maxPosicao); - - - // ToDo cria um novo objeto Figurinha informando a posição sorteada - Figurinha figurinha = new Figurinha(posicao); - - // ToDo adiciona ao pacotinho - add(figurinha); - } - } - - public Album getAlbum() { - return this.album; - } -} diff --git a/Album/src/PacotinhoFigurinhas.java b/Album/src/PacotinhoFigurinhas.java new file mode 100644 index 0000000..99fca42 --- /dev/null +++ b/Album/src/PacotinhoFigurinhas.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.Random; + +public class PacotinhoFigurinhas extends ArrayList { + + private RepositorioFigurinhas repositorioFigurinhas; + + private int quantFigurinhasNoPacotinho; + + private static Random random = new Random(); + + // ToDo atributo que seja uma estrutura para guardar as figurinhas deste pacotinho + + public PacotinhoFigurinhas(RepositorioFigurinhas repositorioFigurinhas, int quantFigurinhasNoPacotinho) { + this.repositorioFigurinhas = repositorioFigurinhas; + this.quantFigurinhasNoPacotinho = quantFigurinhasNoPacotinho; + + adicionarFigurinhasAleatorias(); + } + + // sobrecarga no costrutor, passando aqui as posições desejadas + public PacotinhoFigurinhas(RepositorioFigurinhas repositorioFigurinhas, int[] posicoes) { + this.repositorioFigurinhas = repositorioFigurinhas; + + for (int posicao : posicoes) { + Figurinha fig = repositorioFigurinhas.obterFigurinhaDoRepositorio(posicao); + add(fig); + } + } + + private void adicionarFigurinhasAleatorias() { + int maxPosicao = repositorioFigurinhas.getTamanhoDoAlbum(); + int quantFigurinhasPorPacotinho = this.quantFigurinhasNoPacotinho; + + for (int i = 1; i <= quantFigurinhasPorPacotinho; i++) { + // ToDo sorteia uma posição entre 1 e o tamanho do álbum + int posicao = 1 + random.nextInt(maxPosicao); + + + // ToDo cria um novo objeto Figurinha informando a posição sorteada + Figurinha figurinha = repositorioFigurinhas.obterFigurinhaDoRepositorio(posicao); + + // ToDo adiciona ao pacotinho + add(figurinha); + } + } +} diff --git a/Album/src/RepositorioFigurinhas.java b/Album/src/RepositorioFigurinhas.java new file mode 100644 index 0000000..4cb138b --- /dev/null +++ b/Album/src/RepositorioFigurinhas.java @@ -0,0 +1,29 @@ +import java.util.ArrayList; + +public class RepositorioFigurinhas { + + private ArrayList todasAsFigurinhasDoAlbum; + + private String nomeDoAlbum; + private int tamanhoDoAlbum; + + RepositorioFigurinhas(String nomeDoAlbum, int tamanhoDoAlbum) { + this.tamanhoDoAlbum = tamanhoDoAlbum; + todasAsFigurinhasDoAlbum = new ArrayList<>(); + + todasAsFigurinhasDoAlbum.add(null); // posição 0 + + for (int i = 1; i <= tamanhoDoAlbum; i++) { + Figurinha fig = new Figurinha(i); + todasAsFigurinhasDoAlbum.add(fig); // Figurinha x na posição x + } + } + + Figurinha obterFigurinhaDoRepositorio(int posicao) { + return todasAsFigurinhasDoAlbum.get(posicao); + } + + int getTamanhoDoAlbum() { + return tamanhoDoAlbum; + } +}