Ordenação com Comparable

1 resposta
A

Pessoal, boa tarde. Antes de postar esse tópico pesquisei pelo assunto, mas não o encontrei.
Minha dúvida é o seguinte:
Usando a interface Comparable, pude perceber que quando utilizamos o método sobrescrito compareTo(Object o), dependendo de como o declare, afeta a ordem de impressão na tela. Ex.:

package teste07052011;

import java.util.*;

 class Carro2 implements Comparable<Object>{
	Integer chassi;
	String modelo;
	Carro2(Integer chassi, String modelo){
		this.chassi=chassi;
		this.modelo=modelo;
	}
	
	public String toString(){
		return modelo + " ";
	}
	public int hashCode(){
		return 13;
	}
	public boolean equals(Object o){
		Carro2 c = (Carro2)o;
		if(this.equals(c.modelo))
			return true;
		else
			return false;
	}
	public int compareTo(Object o){
		//return this.modelo.compareTo(((Carro2)o).modelo);
		
		Carro2 x = (Carro2)o;
		//return x.chassi.compareTo(this.chassi);
		return this.chassi.compareTo(x.chassi);
	}
	
}

public class TesteMap2 {
	public static void main(String args[]){
		
		Map <Carro2, Object> lista = new TreeMap<Carro2,Object>();
		Carro2 c1 = new Carro2(1,"A");
		Carro2 c2 = new Carro2(2,"B");
		Carro2 c3 = new Carro2(3,"C");
		Carro2 c4 = new Carro2(1,"A");
		Carro2 c5 = new Carro2(2,"B");
		lista.put(c1, "Mariana");
		lista.put(c2, "Roberto");
		lista.put(c3, "Stella");
		lista.put(c4, "Rubens");
		lista.put(c4, "Rubens");
		lista.put(c5, "Tralala");
		System.out.println(lista);
			
	}

}

Imprime: {A =Rubens, B =Tralala, C =Stella}.
Notem que usei o código compareTo dessa forma:

public int compareTo(Object o){
		//return this.modelo.compareTo(((Carro2)o).modelo);
		
		Carro2 x = (Carro2)o;
		//return x.chassi.compareTo(this.chassi);
		return this.chassi.compareTo(x.chassi);
	}

E no código:

package teste07052011;

import java.util.*;

 class Carro2 implements Comparable<Object>{
	Integer chassi;
	String modelo;
	Carro2(Integer chassi, String modelo){
		this.chassi=chassi;
		this.modelo=modelo;
	}
	
	public String toString(){
		return modelo + " ";
	}
	public int hashCode(){
		return 13;
	}
	public boolean equals(Object o){
		Carro2 c = (Carro2)o;
		if(this.equals(c.modelo))
			return true;
		else
			return false;
	}
	public int compareTo(Object o){
		//return this.modelo.compareTo(((Carro2)o).modelo);
		
		Carro2 x = (Carro2)o;
		return x.chassi.compareTo(this.chassi);
		//return this.chassi.compareTo(x.chassi);
	}
	
}

public class TesteMap2 {
	public static void main(String args[]){
		
		Map <Carro2, Object> lista = new TreeMap<Carro2,Object>();
		Carro2 c1 = new Carro2(1,"A");
		Carro2 c2 = new Carro2(2,"B");
		Carro2 c3 = new Carro2(3,"C");
		Carro2 c4 = new Carro2(1,"A");
		Carro2 c5 = new Carro2(2,"B");
		lista.put(c1, "Mariana");
		lista.put(c2, "Roberto");
		lista.put(c3, "Stella");
		lista.put(c4, "Rubens");
		lista.put(c4, "Rubens");
		lista.put(c5, "Tralala");
		System.out.println(lista);
			
	}

}

Retorna: {C =Stella, B =Tralala, A =Rubens}, ou seja, o inverso do primeiro.
Como podem ver, troquei o retorno nesse último, do método compareTo, de return this.chassi.compareTo(x.chassi);, para: return x.chassi.compareTo(this.chassi);
Por que a troca de this.chassi para x.chassi, inverte a ordem decrescente? :?

1 Resposta

fabiocsilva

Porque invertendo os atributos que você passa para o método você basicamente está dizendo “o que era menor agora é maior e vice-versa”.

Criado 7 de maio de 2011
Ultima resposta 7 de mai. de 2011
Respostas 1
Participantes 2