Dúvidas com a Interface Comparator

Boa noite pessoal.

Hoje me peguei em um pequeno problema.
Nunca implementei a Inteface Comparator para fazer uma Comparacao deste tipo:

vou tentar exemplificar com a entidade pessoa. Fazendo uma ordenação ASC:
Levamos em consideração que as propiedades abaixo sejam os atributos da classe, eu gostaria
de ordenar por todos eles ao mesmo tempo.

Nome - Sobrenome - Idade

É possível?

Então cara sobrescrevendo o método compare() vc coloca a ordem que quizer.
Se não for isso posta o código… é mais fácil pra analizar.

:wink:

Vou testar aqui ver o que acontece!

Porque até o momento eu só conseguir fazer de uma forma ou de outra a ordenação!

Valeu.

Bom dia amigo, tive que desenvolver um Comparator a algum tempo atras, acredito que o código abaixo irá lhe escarescer suas dúvidas!


public class RankingComissionistaClienteComparator implements Comparator {

	private boolean isOdenacaoCidade;

	private boolean isDetalheByCliente;

	private String familiaRanking;

	public RankingComissionistaClienteComparator(boolean isOdenacaoCidade, boolean isDetalheByCliente, String familiaRanking) {
		this.isOdenacaoCidade = isOdenacaoCidade;
		this.isDetalheByCliente = isDetalheByCliente;
		this.familiaRanking = familiaRanking;
	}

	
	/**
	 * Realiza a comparacao entre dois objetos comparable
	 */
	private int compareObjects(Comparable a, Comparable b) {
		//por default sao iguais
		int retorno = 0;

		if (a != null && b != null) {
			retorno = a.compareTo(b);
		}
		else if (a != null || b != null) {
			if (a == null) {
				//A== null, logo B eh maior, deve subir (retorno maior que zero)
				retorno = Integer.MAX_VALUE;
			}
			else {
				//B==null, logo A eh maior deve descer (retorno menor que zero)
				retorno = Integer.MIN_VALUE;
			}
		}

		return retorno;
	}

	public int compareByCidade(RelatorioRankingCE ceA, RelatorioRankingCE ceB) {

		/*
		 * Compara os campos
		 * Observacoes:
		 * qdo comparando uma proproedade de A com B,
		 * se negativo, (menor) fica no topo de um TreeSET
		 * se positivo, (maior) desce dentro de um TreeSET
		 * se igual a 0 ambos sao iguais
		 */
		int compareComissionistaAtual = compareObjects(ceA.getComissionistaAtualCodigo(), ceB.getComissionistaAtualCodigo());
		int compareCidade = compareObjects(ceA.getCidadeNome(), ceB.getCidadeNome());
		int compareClienteCodigo = compareObjects(ceA.getClienteCodigo(), ceB.getClienteCodigo());
		int compareLiderComCod = compareObjects(ceA.getLiderComercialCodigo(), ceB.getLiderComercialCodigo());
		int compareEstado = compareObjects(ceA.getEstadoSigla(), ceB.getEstadoSigla());
		int compareData = compareObjects(ceA.getDataBase(), ceB.getDataBase());
		int comparareRanking = compareObjects(ceA.getTotalPercentual(), ceB.getTotalPercentual());

		int retorno = 0;

		if (compareComissionistaAtual != 0) {
			retorno = compareComissionistaAtual;
		}
		else if (compareCidade != 0) {
			retorno = compareCidade;
		}
		else if (comparareRanking != 0) {

			//A informacao do ranking deve ser o contrario, primeiro os maiores, depois os menores
			retorno = comparareRanking * -1;
		}
		if (retorno == 0) {
			if (isDetalheByCliente) {
				if (compareClienteCodigo != 0) {
					retorno = compareClienteCodigo;
				}
			}
			else {
				if (compareLiderComCod != 0) {
					retorno = compareLiderComCod;
				}
			}
		}

		if (retorno == 0) {
			if (compareEstado != 0) {
				retorno = compareEstado;
			}
			else if (compareData != 0) {
				//A informacao da Data deve ser o contrario, primeior os maiores, depois os menores
				retorno = compareData * -1;
			}
		}
		return retorno;
	}
        //Cuida da implementação do compare... retirei alguns métodos para facilitar a leitura aqui no forum
	public int compare(Object a, Object b) {

		int retorno = 0;

		if (isOdenacaoCidade) {
			retorno = compareByCidade((RelatorioRankingCE) a, (RelatorioRankingCE) b);
		}
		return retorno;
	}
}

O Passo final para realizar a ordenação dos objetos:

Collections.sort(listRelatorioRankingCE, new RankingComissionistaClienteComparator(isOrdenacaoCidade, isDetalheCliente, familiaRanking));

Uma breve explicação, para o efeito esperado da ordenacao são comparados em sequencia os atributos de maior peso… ou seja no exemplo do compareByCidade é primeiro comparado o atributo compareComissionistaAtual pois ele tem maior peso, a seguir por cidade e depois por ranking essa é alógica da ordenação.

Vc pode ainda desenvolver um Comparator generico, baseado em reflection, onde vc fornece uma lista de objetos, sua respectiva classe e a ordem dos campos a serem ordenados, podendo inclusive utilizar a cglib.

Espero ter ajudado!
[]s

Voce quer que caso o nome seja igual então ordene pelo sobrenome e etc?

if(arg0.getNome().equals(arg1.getNome())
 return arg0.getSobrenome().compareTo(arg1.getSobrenome());
return arg0.getNome().compareTo(arg1.getNome());

Basicamente isso.

Não, na realidade o que eu quero é que ordene ao mesmo tempo por nome, idade, e sobrenome tipo:

Suponhamos que tenho os seguintes dados:
Nome: Carlos Sobrenome: Fenanando Idade:19
Nome: João Sobrenome: Costa Idade:10
Nome: Henrique Sobrenome: Aulio Idade:16

Fazendo a ordenação:
Nome: João Sobrenome: Costa Idade:10
Nome: Henrique Sobrenome: Aulio Idade:16
Nome: Carlos Sobrenome: Fenanando Idade:19

Entenderam?

Não entendi… pelo o que vi só a idade está ordenada.

Voce quer escolher qual dos campos será a chave para ordenação?

Se voce entende a lógica é simples.

Dentro do método compare voce só precisa retornar o inteiro dizendo se o objeto é menor ou maior que o outro.

Mas sua lógica que tem que retornar isso.