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