Aula_38__Java_Collections
Aula_38__Java_Collections
Até o momento, trabalhamos apenas com a classe ArrayList para lidarmos com coleções
de objetos de mesmo tipo.
Entretanto, o Java possui diversas outras collections, que veremos na aula de hoje.
Os filhos de java.util.List
A classe ArrayList foi bastante usada até o momento. Com ela, podemos realizar
diversas operações.
@Test
void testeDeUsoDeArrayList() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
assertEquals(3, alunos.size());
assertEquals(fernandoFerreira, alunos.get(0));
assertTrue(alunos.contains(fernandoFerreira));
alunos.remove(fernandoFerreira);
assertFalse(alunos.contains(fernandoFerreira));
alunos.add(fernandoFerreira);
A mensagem de erro do IntelliJ indica uma tal de List<Aluno> e informa que não
consegue converter o retorno de método (que é um List<Aluno>) para um
ArrayList<Aluno>.
Há também outras classes. Veja esse link para conhecer todas elas, e para que elas
servem.
● enquanto ArrayList usa uma lista simples de elementos, LinkedList usa uma
lista duplamente ligada, onde os elementos conhecem diretamente respectivamente
seus antecessores e sucessores. Isso faz com que LinkedList seja mais eficiente
na remoção e na adição de elementos no meio da lista
● ArrayList ocupa menos espaço em memória, pois não precisa armazenar
referências de antecessores e sucessores
@Test
void testeDeUsoDeLinkedList() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
assertEquals(3, alunos.size());
assertTrue(alunos.contains(fernandoFerreira));
alunos.remove(fernandoFerreira);
assertFalse(alunos.contains(fernandoFerreira));
alunos.add(fernandoFerreira);
assertFalse(alunos.isEmpty());
LinkedList<Aluno> subLista = alunos.subList(0, 1);
}
Dessa forma, a alteração no projeto como um todo será mínima, apenas em poucas
classes. Os demais códigos não sofrerão alterações.
Parece que programarmos dessa forma pode ser uma boa alternativa. Ela nos garante
menos alterações no nosso sistema. Elas vão acontecer. Mas se seguirmos essa maneira
de organizar o código, elas serão menores.
Assim, no caso dos nossos testes, podemos seguir a maneira com que o AlunoService
foi criado, fazendo com que ArrayList e LinkedList sejam cada vez menos usados,
substituindo-os quando puder pela interface List.
assertEquals(3, alunos.size());
assertEquals(fernandoFerreira, alunos.get(0));
assertTrue(alunos.contains(fernandoFerreira));
alunos.remove(fernandoFerreira);
assertFalse(alunos.contains(fernandoFerreira));
alunos.add(fernandoFerreira);
assertFalse(alunos.isEmpty());
List<Aluno> subLista = alunos.subList(0, 2);
assertEquals(2, subLista.size());
assertTrue(subLista.contains(claudiaDaSilva));
assertTrue(subLista.contains(joaoSantos));
}
@Test
void testeDeUsoDeListELinkedList() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
assertEquals(3, alunos.size());
assertEquals(fernandoFerreira, alunos.get(0));
assertTrue(alunos.contains(fernandoFerreira));
alunos.remove(fernandoFerreira);
assertFalse(alunos.contains(fernandoFerreira));
alunos.add(fernandoFerreira);
assertFalse(alunos.isEmpty());
List<Aluno> subLista = alunos.subList(0, 2);
assertEquals(2, subLista.size());
assertTrue(subLista.contains(claudiaDaSilva));
assertTrue(subLista.contains(joaoSantos));
}
@Test
void testeDeUsoDeSet() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
Isso é importante! Nem sempre a duplicação de elementos é algo ruim. As vezes é até
necessário.
Pense no cálculo de médias de todos os alunos de uma sala. É bem provável que
existam notas iguais. Logo, devemos manter todas elas.
Mas há casos onde a duplicação é um problema. Não existem 2 alunos com o mesmo
nome e com a mesma chamada na faculdade.
Podemos impedir que isso aconteça, por meio da utilização de outras coleções do Java,
como as que implementam a interface java.util.Set:
No diagrama acima, temos 2 classes que implementam essa interface. Outras classes
podem ser encontradas neste link.
A classe HashSet trabalha com alguns controles para impedir a repetição de objetos dentro
dela. Vamos então aplicá-la no nosso exemplo:
@Test
void testeDeUsoDeHashSet() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
Veja que, embora tenhamos adicionado 4 alunos, temos apenas 3 na coleção, graças a
coleção utilizada.
No nosso caso, podemos classificá-los de acordo com seu nome. Assim podemos criar uma
lista de chamada com esses alunos por exemplo.
Para isso, vamos copiar o método acima e substituir o HashSet pela nossa nova coleção.
Como ambas implementam a interface Set, o ajuste será bem simples:
@Test
void testeDeUsoDeTreeSet() {
Aluno claudiaDaSilva = new Aluno("Claudia da Silva", "550444",
"1TDSPY");
Aluno fernandoFerreira = new Aluno("Fernando Ferreira", "551088",
"1TDSPY");
Aluno joaoSantos = new Aluno("João Santos", "654032", "1TDSPY");
assertEquals(3, alunos.size());
}
A interface java.lang.Comparable
Conforme dito acima, é possível compararmos alunos de diversas formas, e escolhemos a
ordenação por nome, para criarmos a lista de presença dos alunos.
@Override
public int compareTo(Aluno outro) {
return nome.compareTo(outro.nome);
}
Podemos também verificar se houve uma ordenação de fato dos alunos. Para isso,
podemos adicionar o código abaixo no nosso teste:
Claudia da Silva
Fernando Ferreira
João Santos
Exercícios
38.1 - Faça os mesmos testes que fizemos com os alunos, mas agora com os livros. Tente
trabalhar com Lists e Sets. Pode ser que seja necessário escrever mais algum código na
classe Livro. Sem problemas!