Skip to content

Commit

Permalink
final LAB 6 - exercicios 5 e 6
Browse files Browse the repository at this point in the history
  • Loading branch information
vigusmao committed May 21, 2021
1 parent 6b2b9b7 commit d6b631b
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 40 deletions.
21 changes: 11 additions & 10 deletions Album/src/Album.java
Expand Up @@ -4,23 +4,23 @@
import java.util.List;
import java.util.Map;

public class Album {
public class Album<T extends Colecionavel> {

public static final int PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR = 90;

public static final Image IMAGEM_PADRAO_PARA_POSICAO_VAZIA = null;

private final Repositorio repositorio;
private final Repositorio<T> repositorio;
private final int quantItensPorPacotinho;

private List<Colecionavel> itensColados; // direct addressing
private List<T> itensColados; // direct addressing
private int quantItensColados;

// poderíamos fazer novamente direct addressing para as repetidas,
// mas vamos usar um HashMap aqui só para treinarmos
private Map<Integer, Integer> contRepetidasByPosicao;

public Album(Repositorio repositorio, int quantItensPorPacotinho) {
public Album(Repositorio<T> repositorio, int quantItensPorPacotinho) {
this.repositorio = repositorio;
this.quantItensPorPacotinho = quantItensPorPacotinho;

Expand All @@ -35,13 +35,14 @@ public Album(Repositorio repositorio, int quantItensPorPacotinho) {
this.contRepetidasByPosicao = new HashMap<>();
}

public void receberNovoPacotinho(Pacotinho pacotinho) {
Colecionavel[] itensDoPacotinho = pacotinho.getItens();
public void receberNovoPacotinho(Pacotinho<T> pacotinho) {
T[] itensDoPacotinho = pacotinho.getItens();
if (itensDoPacotinho.length != this.quantItensPorPacotinho) {
return; // melhor ainda: lançaria uma checked exception
}

for (Colecionavel item : pacotinho.getItens()) {
for (T item : itensDoPacotinho) {

final int posicao = item.getPosicao();
if (possuiItemColado(posicao)) {
// adiciona como repetida
Expand All @@ -57,7 +58,7 @@ public void receberNovoPacotinho(Pacotinho pacotinho) {
}
}

public Colecionavel getItemColado(int posicao) {
public T getItemColado(int posicao) {
return posicao < 1 || posicao > getTamanho() ? null :
this.itensColados.get(posicao);
}
Expand Down Expand Up @@ -94,13 +95,13 @@ public void autoCompletar() {

for (int i = 1; i <= getTamanho(); i++) {
if (!possuiItemColado(i)) {
Colecionavel item = this.repositorio.getItem(i);
T item = this.repositorio.getItem(i);
colarItem(i, item);
}
}
}

private void colarItem(int i, Colecionavel item) {
private void colarItem(int i, T item) {
this.itensColados.set(i, item);
this.quantItensColados++;
}
Expand Down
37 changes: 25 additions & 12 deletions Album/src/AlbumTest.java
Expand Up @@ -5,20 +5,20 @@

public class AlbumTest {

private Album albumFigurinhas;
private Repositorio repositorioFigurinhas;
private Album<Figurinha> albumFigurinhas;
private Repositorio<Figurinha> repositorioFigurinhas;

private static final int TAMANHO_DO_ALBUM = 200;
private static final int ITENS_POR_PACOTE = 3;

@Before // roda antes de cada teste
public void setUp() {
this.repositorioFigurinhas = new Repositorio("album_copa2014", TAMANHO_DO_ALBUM, "figurinha");
this.albumFigurinhas = new Album(repositorioFigurinhas, ITENS_POR_PACOTE);
this.repositorioFigurinhas = new Repositorio<>("album_copa2014", TAMANHO_DO_ALBUM, "figurinha");
this.albumFigurinhas = new Album<>(repositorioFigurinhas, ITENS_POR_PACOTE);
}

private void popularAlbum(int[] posicoesDesejadas) {
Pacotinho pacote = new Pacotinho(this.repositorioFigurinhas, posicoesDesejadas);
Pacotinho<Figurinha> pacote = new Pacotinho<>(this.repositorioFigurinhas, posicoesDesejadas);
this.albumFigurinhas.receberNovoPacotinho(pacote);
}

Expand Down Expand Up @@ -89,7 +89,7 @@ public void testarAutoCompletar() {
(int) (TAMANHO_DO_ALBUM * Album.PERCENTUAL_MINIMO_PARA_AUTO_COMPLETAR / 100f);

while (albumFigurinhas.getQuantItensColados() < minimoFigurinhasColadasParaAutoCompletar) {
Pacotinho novoPacotinho = new Pacotinho(
Pacotinho<Figurinha> novoPacotinho = new Pacotinho<>(
this.repositorioFigurinhas, ITENS_POR_PACOTE); // aleatório
albumFigurinhas.receberNovoPacotinho(novoPacotinho);
}
Expand All @@ -107,13 +107,8 @@ public void testarAutoCompletar() {
@Test
public void testarGetItemColado() {
popularAlbum(new int[] {1, 2, 3});
final Colecionavel itemColado = albumFigurinhas.getItemColado(2);
final Figurinha figurinha = albumFigurinhas.getItemColado(2);

if (!(itemColado instanceof Figurinha)) {
fail("O item colado deveria ser uma Figurinha!!");
}

Figurinha figurinha = (Figurinha) itemColado;
assertNotNull(figurinha);

assertEquals(2, figurinha.getPosicao());
Expand All @@ -131,4 +126,22 @@ public void testarRejeicaoPacotinhosDeTamanhoErrado() {
0, albumFigurinhas.getQuantItensColados());
}

@Test
public void testarTiposDeColecionavelDistintos() {
Repositorio<Figurinha> repoFig = new Repositorio<>("ursinhos", 10, "figurinha");
Repositorio<Selo> repoSelo = new Repositorio<>("selos-do-mundo", 10, "selo");

Album<Figurinha> albumFig = new Album<>(repoFig, 3);
Album<Selo> albumSelo = new Album<>(repoSelo, 2);

Pacotinho<Figurinha> pacoteFig = new Pacotinho<>(repoFig, new int[]{2, 5, 8});
Pacotinho<Selo> pacoteSelo = new Pacotinho<>(repoSelo, 2);

albumFig.receberNovoPacotinho(pacoteFig);
albumSelo.receberNovoPacotinho(pacoteSelo);

assertEquals(3, albumFig.getQuantItensColados());
assertEquals(2, albumSelo.getQuantItensColados());
}

}
15 changes: 8 additions & 7 deletions Album/src/Pacotinho.java
@@ -1,13 +1,13 @@
import java.util.Random;

public class Pacotinho {
public class Pacotinho<T extends Colecionavel> {

private Random random;
private Colecionavel[] itens;

public Pacotinho(Repositorio repo, int[] posicoesDesejadas) {
public Pacotinho(Repositorio<T> repo, int[] posicoesDesejadas) {

this.itens = new Figurinha[posicoesDesejadas == null ? 0 :
this.itens = new Colecionavel[posicoesDesejadas == null ? 0 :
posicoesDesejadas.length];

if (posicoesDesejadas != null) {
Expand All @@ -22,7 +22,7 @@ public Pacotinho(Repositorio repo, int[] posicoesDesejadas) {
* @param repo o repositório desejado
* @param quantItens a quantidade de itens a constar no pacotinho
*/
public Pacotinho(Repositorio repo, int quantItens) {
public Pacotinho(Repositorio<T> repo, int quantItens) {
this.itens = new Colecionavel[quantItens];

this.random = new Random();
Expand All @@ -36,15 +36,16 @@ public Pacotinho(Repositorio repo, int quantItens) {
preencherPacotinho(repo, posicoesAleatorias);
}

private void preencherPacotinho(Repositorio repo, int[] posicoesDesejadas) {
private void preencherPacotinho(Repositorio<T> repo, int[] posicoesDesejadas) {
for (int i = 0; i < posicoesDesejadas.length; i++) {
int posicao = posicoesDesejadas[i];
Colecionavel item = repo.getItem(posicao);
this.itens[i] = item;
}
}

public Colecionavel[] getItens() {
return this.itens;
@SuppressWarnings("unchecked")
public T[] getItens() {
return (T[]) this.itens;
}
}
22 changes: 11 additions & 11 deletions Album/src/Repositorio.java
@@ -1,33 +1,33 @@
import java.util.ArrayList;
import java.util.List;

public class Repositorio {
public class Repositorio<T extends Colecionavel> {

private static final String PREFIXO_URL_IMAGENS = "http://www.nossoalbum.com.br/imagens/";

private List<Colecionavel> todasAsFigurinhas;
private List<T> todosOsItens;

private int quantFigurinhas;

@SuppressWarnings("unchecked")
public Repositorio(String sufixoUrlImagens, int quantFigurinhas, String tipoDeColecionavel) {
this.quantFigurinhas = quantFigurinhas;
public Repositorio(String sufixoUrlImagens, int quantItens, String tipoDeColecionavel) {
this.quantFigurinhas = quantItens;

todasAsFigurinhas = new ArrayList<>();
todasAsFigurinhas.add(null); // ocupando a posição 0 com um null
for (int i = 1; i <= quantFigurinhas; i++) {
todosOsItens = new ArrayList<>();
todosOsItens.add(null); // ocupando a posição 0 com um null
for (int i = 1; i <= quantItens; i++) {

Colecionavel item = ColecionavelFactory.criarColecionavel(
T item = (T) ColecionavelFactory.criarColecionavel(
tipoDeColecionavel, i, PREFIXO_URL_IMAGENS + sufixoUrlImagens);
todasAsFigurinhas.add(item);
todosOsItens.add(item);
}
}

public int getTotalFigurinhas() {
return this.quantFigurinhas;
}

public Colecionavel getItem(int pos) {
return this.todasAsFigurinhas.get(pos);
public T getItem(int pos) {
return this.todosOsItens.get(pos);
}
}

0 comments on commit d6b631b

Please sign in to comment.