Método CompareTo do Comparable n~eo é chamado

7 respostas
cintiarsbr

Olá Pessoal

Estava fiz o seguinte exemplo utilizando Comparable. O problema é que a minha classe, para testar, não esta chamando o método compareTo. Alguém pode dar uma verificada para ver o que estou fazendo de errado, já procurei exemplos inclusive aqui no GUJ, mas achie todos iguais ao que eu fiz, deve ter um detalhe que eu estou deixando passar.

CLASSE QUE IMPLEMENTA COMPARABLE

package collections.br;

import java.util.Calendar;

public class Cliente implements Comparable <Cliente>{

	private String nome;
	private String endereco;
	private int idade;
	private Calendar nascimento;
		
	@Override
	public int compareTo(Cliente o) {
		
		System.out.println("Entrou aqui");
		if(this.nome.compareTo(o.getNome()) < 0) {
			return -1 ;
		}
		if(this.nome.compareTo(o.getNome()) > 0) {
			return 1;
		}
			return 0; 
	}

	public String getNome() {
		System.out.println("GetNome");
		return nome;
	}

	public void setNome(String nome) {
		System.out.println("SetNome");
		this.nome = nome;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public Calendar getNascimento() {
		return nascimento;
	}

	public void setNascimento(Calendar nascimento) {
		this.nascimento = nascimento;
	}
	
	

}

CLASSE QUE TESTA A COMPARABLE

package collections.br;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class TestaCliente{

	static List<Cliente> clientes = new ArrayList<Cliente>();
	
	public static void main(String[] args) {
			
				
		Cliente c1 = new Cliente();
		c1.setNome("Cíntia");
		c1.setEndereco("Rua Maria Januaria, 156");
		c1.setIdade(25);
		Calendar d = Calendar.getInstance();
		d.set(1983, 5, 20);
		c1.setNascimento(d);
		
		
		Cliente c2 = new Cliente();
		c2.setNome("Leandro");
		c2.setEndereco("Rua Dr. Barcelos, 46");
		c2.setIdade(29);
		d.set(1979, 0, 3);
		c2.setNascimento(d);
		
		Cliente c3 = new Cliente();
		c3.setNome("Caroline");
		c3.setEndereco("Rua Veneza, 01");
		c3.setIdade(28);
		d.set(1981, 0, 4);
		c3.setNascimento(d);
		
		Collections.sort(clientes);
		
		
	}
}

7 Respostas

Marcelo_FS

Faltou você adicionar os clientes à lista… :slight_smile:

M

Sugestão de legibilidade e performance:

Em outras palavras, você está fazendo duas comparações para retornar o que o método compareTo da String retorna. Não seria melhor:

@Override
	public int compareTo(Cliente o) {		
		return this.nome.compareTo(o.getNome());
	}
B

Outro problema: Os três clientes vão ter a mesma data de nascimento.

abelgomes

rapaz…o meu aqui ta blz…

segue

public class Pessoa implements Comparable<Pessoa>{
	
	
	private String nome;
	private String endereco;
	private String telefone;
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	@Override
	public int compareTo(Pessoa p) {
		
		if(getNome().compareTo(p.getNome()) < 0){
			return -1;
		}
		
		if(getNome().compareTo(p.getNome()) > 0){
			return 1;
		}
			return 0;
	}
	
	

}



import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class TesteComparable {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Pessoa p = new Pessoa();
		p.setNome("Abel");
		p.setEndereco("endereco 1");
		p.setTelefone("4654654");
		
		Pessoa p2 = new Pessoa();
		p2.setNome("Joyce");
		p2.setEndereco("endereco asdsa1");
		p2.setTelefone("4654654123213");
		
		Pessoa p3 = new Pessoa();
		p3.setNome("Xacarias");
		p3.setEndereco("endereco asdsa1");
		p3.setTelefone("4654654123213");
		
		Pessoa p4 = new Pessoa();
		p4.setNome("Zebras");
		p4.setEndereco("endereco asdsa1");
		p4.setTelefone("4654654123213");
		

		List<Pessoa> c = new ArrayList<Pessoa>();
		c.add(p4);
		c.add(p3);
		c.add(p2);
		c.add(p);
		Collections.sort(c);
		
		for (Pessoa pessoa : c) {
			System.out.println(pessoa.getNome());
			
		}

	}

}

ta fazendo tudo certinho…

bsl.lacerda

Também dá pra fazer com Comparator.

public class ComparatorCliente implements Comparator<Cliente> {

	@Override
	public int compare(Cliente c1, Cliente c2) {
		return c1.getNome().compareTo(c2.getNome());
	}

}

O Teste

public class TestaClienteComparator {
	
	public static void main(String[] args) {
		List<Cliente> clientes = new ArrayList<Cliente>();
		
		Cliente cliente = new Cliente();
		cliente.setNome("Bruno");
		
		Cliente cliente2 = new Cliente();
		cliente2.setNome("Carlos");
		
		Cliente cliente3 = new Cliente();
		cliente3.setNome("Duda");
		
		clientes.add(cliente3);
		clientes.add(cliente2);
		clientes.add(cliente);
		
		// Ordena Crescente
		Comparator<Cliente> compareClienteNomeAsc = new ComparatorCliente();
		
		// Ordena decrescente
		Comparator<Cliente> compareClienteNomeDesc = Collections.reverseOrder(compareClienteNomeAsc);
		
		Collections.sort(clientes, compareClienteNomeAsc);
		
		for (Cliente clienteAsc : clientes) {
			System.out.println("Cliente: " + clienteAsc.getNome());
		}
		
		System.out.println("++++++++++++++++++++++++++++");
		
		Collections.sort(clientes, compareClienteNomeDesc);
		
		for (Cliente clienteAsc : clientes) {
			System.out.println("Cliente: " + clienteAsc.getNome());
		}
		
	}	
	
}

Testa aí…

cintiarsbr

Oi Pessoal!! Valeu pelas dicas de melhoria e pela chamada de atenção… foi mal, nem me dei conta que não estava colocando em uma lista…

cintiarsbr

hum, vou tentar com Comparator tb para aprender, valeu!!!

Criado 22 de dezembro de 2008
Ultima resposta 22 de dez. de 2008
Respostas 7
Participantes 6