Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

glauco.todesco@gmail.com

TreeSet e Comparator

Recommended Posts

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

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

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
@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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.