Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Collection Set com ítem repetido?

No exercício proposto no curso na Aula 06 (Aplicando o Set no modelo) fiz uma variação do código a fim de reduzir a quantidade de linhas do programa, mas me deparei com a seguinte situação: inclui dois objetos com os mesmos dados do aluno para ver o set eliminar o ítem duplicado, e para minha surpresa, ele não eliminou.

Teria isso ocorrido porque trata se de instâncias/referências diferentes?

package br.com.caelum.collections;

public class TestaClasseAlunos {

    public static void main(String[] args) {
        Curso curso = new Curso("Java", "Girafales");

        curso.adiciona(new Aula("Eclipse", 20));
        curso.adiciona(new Aula("Hello World", 20));
        curso.adiciona(new Aula("Arrays", 20));
        curso.adiciona(new Aula("Collections", 20));

        curso.matricula(new Aluno("Fagner", 1234));
        curso.matricula(new Aluno("Marcos", 1235));
        curso.matricula(new Aluno("Maria", 1236));
        curso.matricula(new Aluno("Maria", 1236));

        System.out.println(curso);
    }

}

A saída ficou assim:

[ Curso: Java, tempo total: 80, aulas: + [[Aula: Eclipse, 20], [Aula: Hello World, 20], [Aula: Arrays, 20], [Aula: Collections, 20]], alunos: [[Nome: Maria, Matricula: 1236], [Nome: Fagner, Matricula: 1234], [Nome: Marcos, Matricula: 1235], [Nome: Maria, Matricula: 1236]] ]

Abaixo segue a classe Curso:

package br.com.caelum.collections;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Curso {
    private String nome;
    private String instrutor;
    private List<Aula> aulas = new LinkedList<>();
    private Set<Aluno> alunos = new HashSet<>();

    Curso(String nome, String instrutor){
        this.nome = nome;
        this.instrutor = instrutor;
    }

    public final String getNome() {
        return nome;
    }

    public final void setNome(String nome) {
        this.nome = nome;
    }

    public final String getInstrutor() {
        return instrutor;
    }

    public final void setInstrutor(String instrutor) {
        this.instrutor = instrutor;
    }

    public final List<Aula> getAulas() {
        return Collections.unmodifiableList(this.aulas);
    }

    public void adiciona(Aula aula) {
        this.aulas.add(aula);
    }

    public int getTempoTotal() {
        int tempoTotal = 0;
        for (Aula aula : aulas) {
            tempoTotal += aula.getTempo();
        }
        return tempoTotal;
    }

    public final Set<Aluno> getAlunos() {
        return Collections.unmodifiableSet(this.alunos);
    }

    public void matricula(Aluno aluno) {
        this.alunos.add(aluno);
    }

    public boolean estaMatriculado(Aluno aluno) {
        return this.alunos.contains(aluno);
    }

    @Override
    public String toString() {
        return "[ Curso: " + this.getNome() + ", tempo total: " + this.getTempoTotal()
                + ", aulas: + " + this.aulas + ", alunos: " + this.getAlunos() + " ]";
    }
}
1 resposta
solução!

A resposta estava na aula seguinte. Faltou a implementação do metodo hashCode.

Ao implementar o método o conjunto passou a não conter mais repetições.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software