glauco.todesco@gmail.com 0 Denunciar post Postado Março 29, 2017 Caros, Estou com problemas ao usar um TreeSet com um comparador externo. O objetivo é não repetir o código de um mesmo produto e ordenar o set pelo valor do produto. Porém eu tenho como saída dois produtos com o mesmo código, no caso o produto de código 4, já o produto de código 2 só tem 1. O que está errado? Segue o código: Classe Produto public class Produto { private int codigo; private String descricao; private double valor; ..... @Override public String toString() { return "Produto{" + "codigo=" + codigo + ", descricao=" + descricao + ", valor=" + valor + '}'; } } Classe Comparador de Produto: public class ComparadorProdutoValor implements Comparator<Produto>{ @Override public int compare(Produto o1, Produto o2) { if(o1.getCodigo() == o2.getCodigo()){ return 0; } else if(o1.getValor() > o2.getValor()){ return 1; } else{ return -1; } } } Classe Teste: public class Teste { public static void main(String[] args) { TreeSet <Produto> ts = new TreeSet(new ComparadorProdutoValor()); ts.add(new Produto(4,"AAA",200)); ts.add(new Produto(5,"BBB",300)); ts.add(new Produto(2,"DDD",500)); ts.add(new Produto(2,"FFF",700)); ts.add(new Produto(4,"EEE",600)); for(Produto p : ts) System.out.println(p); } } Saida: Produto{codigo=4, descricao=AAA, valor=200.0} Produto{codigo=5, descricao=BBB, valor=300.0} Produto{codigo=2, descricao=DDD, valor=500.0} Produto{codigo=4, descricao=EEE, valor=600.0} Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 29, 2017 O segundo objeto de código 2 não está sendo inserido no TreeSet por causa do comparator.https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html package forum; import java.util.Comparator; public class ComparadorProdutoValor implements Comparator<Produto> { @Override public int compare(Produto o1, Produto o2) { if(o1.getValor() > o2.getValor()){ return 1; } else if (o1.getValor() < o2.getValor()){ return -1; } else { return 0; } } } Compartilhar este post Link para o post Compartilhar em outros sites
glauco.todesco@gmail.com 0 Denunciar post Postado Março 29, 2017 Olá Isis, O ponto é que o critério de igualdade entre dois objetos tem que ser o código e o critério de ordenação o valor. Ou seja, a resposta que eu queria ter para a saída do exemplo acima seria o mostrado abaixo, mas no caso ele mostra duas vezes um objeto com o código quatro. Produto{codigo=4, descricao=AAA, valor=200.0} Produto{codigo=5, descricao=BBB, valor=300.0} Produto{codigo=2, descricao=DDD, valor=500.0} Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 31, 2017 @Override public int compare(Produto o1, Produto o2) { if (o1.getCodigo() == o2.getCodigo()) { if(o1.getValor() > o2.getValor()){ return -1; } else if (o1.getValor() < o2.getValor()){ return 1; } else { return 0; } } else { return (o1.getCodigo() > o2.getCodigo())? 1 : -1; } } Compartilhar este post Link para o post Compartilhar em outros sites
glauco.todesco@gmail.com 0 Denunciar post Postado Abril 4, 2017 Obrigado pelo retorno mas deu certo assim também. Aqui imprimiu tudo: Produto{codigo=2, descricao=FFF, valor=700.0} Produto{codigo=2, descricao=DDD, valor=500.0} Produto{codigo=4, descricao=EEE, valor=600.0} Produto{codigo=4, descricao=AAA, valor=200.0} Produto{codigo=5, descricao=BBB, valor=300.0} O que funcionou foi primeiro criar o HashSet para garantir a igualdade pelo código e depois adicionar o hash no TreeSet para ordenar pelo valor. Mas eu não gostaria de usar essa solução Compartilhar este post Link para o post Compartilhar em outros sites