Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

matriculei alguns alunos em alguns cursos usando Set<Aluno> porem existe duplicacao de alunos , na saida, quando nao deveria por estar usando Set, onde está o erro?

package collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class TestaAlunoNoCurso {

    public static void main(String[] args) {

        List<Curso> cursos = new ArrayList<>();

        Curso curso = new Curso("Programação Orientea a Objeto", "Elisângelo Alves");
        Curso curso1 = new Curso("Programação Procedural", "Eber Alves");
        Curso curso2 = new Curso("Git e GitHub", "Lucas LIma");

        curso.adiciona(new Aula("Teoria da Computação", 30));
        curso.adiciona(new Aula("Fazendo massa" , 15));
        curso.adiciona(new Aula("Vendendo massa de pastel" , 35));
        cursos.add(curso);

        curso1.adiciona(new Aula("Introducão a Computação", 30));
        curso1.adiciona(new Aula("Python avançado" , 15));
        cursos.add(curso1);

        curso2.adiciona(new Aula("JavaScript nas nuvens" , 35));
        cursos.add(curso2);

        Set<Aluno> alunos = new HashSet<>();

        alunos.add(new Aluno("Elisangelo", 22113456));
        alunos.add(new Aluno("Laudicéia", 98768987));
        alunos.add(new Aluno("NIckolas", 43252344));

        for (Aluno aluno : alunos) {
            curso.matricula(aluno);
            curso2.matricula(aluno);
            System.out.println(aluno);        
        }


        curso2.matricula(new Aluno("Elisangelo", 22113456));
        curso2.matricula(new Aluno("Laudicéia", 98768987));
        curso1.matricula(new Aluno("NIckolas", 43252344));
        System.out.println("=============== ");

        System.out.println(cursos.get(2).getAlunos().size());

        for (Curso materia : cursos) {
            System.out.println("Cursos: " + materia);
            System.out.println("Alunos matriculados: " + materia.getAlunos());

        }

    }

}
3 respostas
solução!

Oi ELISANGELO

Você precisa implementar os métodos equals() e hashCode() na sua classe Aluno para que o Set consiga ver que são os mesmos alunos, caso contrário ele vai usar o endereço de memória através do == e como você está criando outro aluno usando New entende-se que não é o mesmo aluno.

a bom, valeu, eu realmente nao fiz nada de implementacao de equal() ou haxhCode() na minha classe de alunos nao, pq nesta parte do curso , o paulo silveira na alura nao implementou esta parte tb nao... talvez eu tenha feito simulacoes a frente do que ele explicou... de fato eu so vi o nico no curso anterior sobrescrevendo o metodo equals, pq ele estava comparando objetos.... valeu! Mas pelo que eu achei que tinha entendido, por usar o SET , nao deveria haver duplicacao, de objetos automaticamente, semprecisar de implementar nada, pq estes eh uma das vantagens em relacao ao LIST , correto?

Correto ELISANGELO, o Set não deixa adicionar elementos repetidos, porém o objeto adicionado no Set precisa implementar equals e hashCode para funcionar adequadamente. Sem o equals e o hashCode o Set vai considerar apenas o endereço de memória dos objetos (usando o operador ==) para definir se o objeto já existe no Set