Interface Comparator [RESOLVIDO]

7 respostas
S

Olá pessoal , estou com dificuldades em ordenar um TreeSet em ordem decrescente com a interface Comparator.
Li alguns artigos sobre o assunto e inclusive alguns artigos do guj mesmo, mas continuo sem entender, gostaria de um help.

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class Programa implements Comparator<Programa> {

	private int id;
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	Set<Integer> lista = new TreeSet<Integer>();
	
	@Override
	public int compare(Programa o1, Programa o2) {
		// Não entendi essa parte, o que fazer aqui ???
		return 0;
	}
		
	public void preencheLista(){
		for(int i = 0; i < 15; i++){
			int aux = (int) (Math.random() * 1000);
			lista.add(aux);
		}
		System.out.println(lista);
	}
	
	public static void main(String[] args) {
		Programa p = new Programa();
		p.preencheLista();
	}
}

Atenciosamente,
Fernando.

7 Respostas

R

Jovem,

Este “post” é quase um tutorial, dê uma olhadinha:

http://www.guj.com.br/posts/list/45985.java#241201

V

Você não deve implementar Comparator, e sim Comparable. Comparator é para criar um comparador externo.

O método compare deve retornar

qualquer número > 0, se seu objeto for maior do que o objeto sendo comparado (o1 > o2)

0, se os objetos forem iguais

qualquer número  < 0, se seu objeto for menor do que o objeto comparado (o1 < o2)

A lida no tutorial do mantu ali em cima vai explicar melhor.

P

Fernando,

A sua lista é de Integer, então ela já é ordenada naturalmente.
pra vc usar a ordem decrescente, vc usa no construtor do treeset um comparator de ordem inversa.Isso já tem implementado na API.

faça assim:
Set&lt;Integer&gt; lista = new TreeSet&lt;Integer&gt;(Collections.reverseOrder())
; Agora se vc quer adicionar na lista objetos do tipo programa, e quer q eles fiquem ordenados por ordem descrescente por ID, então vc faz assim: no lugar de:
Set&lt;Integer&gt; lista = new TreeSet&lt;Integer&gt;();
você coloca:
Set&lt;Programa&gt; lista = new TreeSet&lt;Programa&gt;();

depois vc cria vários objetos do tipo programa, seta os ID's deles e adiciona na lista.

no método compare vc faz:

public int compare(Programa o1, Programa o2) {  
        
         return o2.id.compareTo(o1.id);  
 }
o id ao invés de ser int vc coloca como Integer. ou deixa como int e faz return o2.id - o1.id.

espero ter ajudado ;)

J

Com licenca mais estou com um pouquinho de duvida a respeito do comparator, pois peguei uma ArrayList e Convert para HashSet so que eu queria ordenar, pois estou com um pouco de dificuldade nisso e ja li diversos assuntos mais mesmo assim nao consegui implementar… alguem poderia dar uma mãozinha ?

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Set;

public class ListParaHashSet {

public static void main(String[] args) {

	System.out.println("Lista Desordenada");
	ArrayList&lt;String&gt; frutas = new ArrayList&lt;String&gt;();
	frutas.add("maca");
	frutas.add("pera");
	frutas.add("pera");
	frutas.add("uva");
	frutas.add("maca");
	frutas.add("maracuja");
	frutas.add("banana");
	frutas.add("abacaxi");

	System.out.println("");

	for (String listaDesordenada : frutas) {
		System.out.println(listaDesordenada);
	}
	
	System.out.println("\n\nListaOrdenada\n");
	Set&lt;String&gt; frutazinhas = new HashSet&lt;String&gt;(frutas);
	
	for (String listaOrdenada : frutazinhas) {
		System.out.println(listaOrdenada);
	}
}

}

Se possível colocar seu método de implementar já na main

V

O HashSet não é ordenado. Se quer ordenação, use um TreeSet.

E, quando for postar códigos, use a tag code:

J

[quote=ViniGodoy]O HashSet não é ordenado. Se quer ordenação, use um TreeSet.

E, quando for postar códigos, use a tag code:

Valeu pelas dicas de formatacao, pois estava ate sem graça de ter postado daquela maneira… Sim eu sei que um HashSet não e ordenado, mais o meu exercicio e para ordenar um HashSet que antes havia sido transformado de um ArrayList.
entao exemplificando: tinha um ArrayList que passei para um HashSet que agora queria que fizesse uma ordenacao por meio de comparator ou comparable (de preferencia queria os 2 exemplos) .

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

public class ListParaHashSet {

	public static void main(String[] args) {

		System.out.println("Lista Desordenada");
		ArrayList&lt;String&gt; frutas = new ArrayList&lt;String&gt;();
		frutas.add("maca");
		frutas.add("pera");
		frutas.add("pera");
		frutas.add("uva");
		frutas.add("maca");
		frutas.add("maracuja");
		frutas.add("banana");
		frutas.add("abacaxi");

		System.out.println("");

		for (String listaDesordenada : frutas) {
			System.out.println(listaDesordenada);
		}
		
		System.out.println("\n\nListaOrdenada\n");
		Set&lt;String&gt; frutazinhas = new HashSet&lt;String&gt;(frutas);
		
		for (String listaOrdenada : frutazinhas) {
			System.out.println(listaOrdenada);
		}
	}

}

Então como ficaria?

V

Já leu o post que o robinsonbsilva indicou?

Criado 1 de fevereiro de 2010
Ultima resposta 30 de mar. de 2012
Respostas 7
Participantes 5