Boa tarde!
Estou com o seguinte problema:
Tenho que ordenar itens de uma lista com base em múltiplos critérios ordenados.
Tenho a classe (entidade) abaixo que define a priorização, salva numa tabela do banco:
public class Prioridade
{
private String nomePrioridade;
/**
* Se esta prioridade está ativa ou não
*/
private boolean ativo;
/**
* Contém os valores que serão priorizados e sua respectiva ordem
*/
private TreeMap<Byte, String> mapaValores;
}
Representação no BD:
nomePrioridade campos usados no mapa - valor e ordem ativo
Método de Pagamento ; DD; 1; 1
Regional; SP; 1; 1
Regional; BA; 2; 1
Preciso ordenar objetos da classe abaixo - armazenados em um List
public class FaturaDevolvida
implements Serializable {
private static final long serialVersionUID = 1L;
private int identificao;
private Long numeroConta;
private String fornecedor;
private String motivoDevolucao;
private String metodo_Pagto;
Tenho 5 níveis de priorização:
Nos primeiros três deles, tenho que ordenar a lista conforme valores de alguns campos dos objetos - que comparo com valores do mapa da classe Prioridade.
Nos últimos, tenho que ordenar conforme o valor de alguns campos em ordem ascendente ou descrescente.
Os últimos níveis de priorização eu poderia fazer até no código SQL, mas são tantos os níveis que está ficando muito difícil…
Criei então uma classe que implementa Comparator:
private class ComparadorMetodoPagamento implements Comparator {
private TreeMap<Byte, String> mapaPriorizacao;
public ComparadorMetodoPagamento(TreeMap<Byte, String> mapaPriorizacao) {
setMapaPriorizacao(mapaPriorizacao);
}
private TreeMap<Byte, String> getMapaPriorizacao() {
return mapaPriorizacao;
}
private void setMapaPriorizacao(TreeMap<Byte, String> mapaPriorizacao) {
this.mapaPriorizacao = mapaPriorizacao;
}
public int compare(Object obj1, Object obj2) {
int retorno = 0;
if (obj1 == null || obj2 == null) {
return 0;
}
FaturaDevolvida objeto1 = (FaturaDevolvida) obj1;
FaturaDevolvida objeto2 = (FaturaDevolvida) obj2;
for (Byte ordem : getMapaPriorizacao().keySet()) {
if (objeto1.getMetodo_Pagto().equals(getMapaPriorizacao().get(ordem))
&& objeto2.getMetodo_Pagto().equals(getMapaPriorizacao().get(ordem))) {
retorno = 0;
} else if (objeto1.getMetodo_Pagto().equals(getMapaPriorizacao().get(ordem))
&& !objeto2.getMetodo_Pagto().equals(getMapaPriorizacao().get(ordem))) {
retorno = 1;
} else {
retorno = -1;
}
}
return retorno;
}
}
Bom, o que eu estou tentando fazer então:
//1 - Instancio a lista e a alimento
List<FaturaDevolvida> listaFaturas = new ArrayList <FaturaDevolvida> ();
while (resultSet.next()) {
//... alimentando lista
}
//2 - Recupero todos os 5 níveis de priorização do BD
//recuperando informações de prioridades
PrioridadeMailingDAO prioridadeDAO =
new PrioridadeMailingDAO(getDadosAcessoBD());
List<PrioridadeMailing> prioridades =
prioridadeDAO.getListaPrioridadeMailing();
//3 - Recupero o primeiro nível de priorização - se conseguir fechar esse, faço para os demais objetos de Prioridade
PrioridadeMailing priori = null;
for (PrioridadeMailing prioriI : prioridades)
{
if (prioriI.getNomePrioridade().equals("Método de Pagamento"))
{
priori = prioriI;
break;
}
}
//4 - Utilizo o sort propriamente dito
ComparadorMetodoPagamento comparador =
new ComparadorMetodoPagamento(priori.getMapaValores());
Collections.sort(listaFaturas, comparador);
O grande problema é que não está ordenando corretamente. Como posso proceder?