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

Aula 8 [TreeSet e Comparator]

Olá, boa noite.

Ao reescrever o método "compare", quando implementamos Comparator, a solução que cheguei foi a mesma disponibilizada pela alura:

    @Override
    public int compare(Funcionario funcionario1, Funcionario funcionario2) {
        return funcionario1.getIdade() - funcionario2.getIdade();
    }

Porém, ao adicionar um funcionário com um nome diferente, mas com idades iguais, ele não consegue buscar um dos funcionários com a idade igual:

public class TestaFuncionario {
    public static void main(String args[]) {

        Funcionario f1 = new Funcionario("Barney", 13);
        Funcionario f2 = new Funcionario("Jonatan", 9);
        Funcionario f3 = new Funcionario("Guaraciara", 13);

        Set<Funcionario> funcionarios = new TreeSet<>(new OrdenaPorIdade());
        funcionarios.add(f1);
        funcionarios.add(f2);
        funcionarios.add(f3);

        Iterator<Funcionario> iterador = funcionarios.iterator();

        while (iterador.hasNext()) {
            System.out.println(iterador.next().getNome());
        } 
    }

}

Jonatan Barney

Qual seria a melhor solução, neste caso? Verificar se são iguais, no método comparable? E caso for iguais, como saber qual foi o objeto que foi retornado?

3 respostas

Oi Rafael,

só para eu entender, o que vc quis dizer com "ele não consegue buscar um dos funcionários com a idade igual"?

Abraços, Nico

Se você ver o resultado da execução, verificará que ele só vai exibir 2 nomes, porém foram adicionados 3 funcionários. Resolvi verificando se a idade é igual, e caso for, retorno -1. Mas gostaria de saber se isso é uma boa prática, ou se existe um outro meio de solucionar o problema.

solução!

Agora entendi! A saída ficou um pouco "tímida" na sua pergunta :)

Segue a resposta:

O TreeSet também é um Set e não permite elementos duplicados, com a diferença que o critério de igualdade é definido pelo seu Comparator (e não pelo hashCode e equals).

Para resolver o problema, dentro do Comparator, vc precisa levar em consideração o nome do aluno também, por exemplo:

public class OrdenaPorIdade implements Comparator<Funcionario> {

    @Override
    public int compare(Funcionario funcionario1, Funcionario funcionario2) {
        int diff = funcionario1.getIdade() - funcionario2.getIdade();

        if(diff == 0) {
            return funcionario1.getNome().compareTo(funcionario2.getNome());
        }

        return diff;
    }

}

e o teste:

public class Teste {
    public static void main(String args[]) {

        Funcionario f1 = new Funcionario("Barney", 13);
        Funcionario f2 = new Funcionario("Jonatan", 9);
        Funcionario f3 = new Funcionario("Guaraciara", 13);
        Funcionario f4 = new Funcionario("Guaraciara", 13);

        Set<Funcionario> funcionarios = new TreeSet<>(new OrdenaPorIdade());
        funcionarios.add(f1);
        funcionarios.add(f2);
        funcionarios.add(f3);
        funcionarios.add(f4);

        for (Funcionario funcionario : funcionarios) {
            System.out.println(funcionario.getNome());
        }

    }
}

Com a saída:

Jonatan
Barney
Guaraciara

Abs

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