Boa tarde,
Gostaria de implementar um Camparator Dinâmico. Isso é possível?
O getFiltro1 cada hora vai ser um fitro diferente conforme escolhido pelo usuário.
return = Obj1.getFiltro1().compareTo(Obj1.geFiltro1());
Obrigada
Boa tarde,
Gostaria de implementar um Camparator Dinâmico. Isso é possível?
O getFiltro1 cada hora vai ser um fitro diferente conforme escolhido pelo usuário.
return = Obj1.getFiltro1().compareTo(Obj1.geFiltro1());
Obrigada
Este código, no mínimo, vai ficar difícil de ser compreendido, detalhe o que necessita para que seja mais fácil ajudar.
o código que voce fez usa compareTo, que é de Comparable. o Comparable não é mto indicado para fazer comparadores dinamicos. mas aí tem o Comparator (com metodo compare apenas) que é indicado pra isso.
recomendo esse artigo sobre o assunto:
http://blog.caelum.com.br/2010/06/22/ordenando-colecoes-com-comparable-e-comparator/
Eu usuario o padrão decorator para resolver esse problema.
Esse codigo ordena conforme o case escolhido:
Case1 = nome
Case2 = nome e cidade
Preciso fazer uma implementação onde usuário escolhe assim:
Quero fazer uma ordenação por cidade… ai entra no case1
Quero fazer uma ordenação por nome… ai entra no case1
Quero fazer uma ordenação por cidade e nome… ai entra no case2
No meu código a ordenação está fixa. Gostaria de tornar isso dinâmico assim:
case 2:
retorno = emp1.getPrimeiroParametro().compareTo(emp2.getPrimeiroParametro());
if (retorno != 0) return retorno;
retorno = emp1.getSegundoParametro().compareTo(emp2.getSegundoParametro());
break;
Abaixo segue o código atual…
class teste{
String nome;
String cidade;
String prof;
public teste(String c, String p, String n) {
nome = n; cidade = c; prof = p;
}
public String toString() {
return cidade + " - " + prof + " - " + nome;
}
public String getcidade() {
return cidade;
}
public String getprof() {
return prof;
}
public String getnome() {
return nome;
}
}
class Person implements Comparator<teste>
{
int qtparametros = 3;
public int compare(testeemp1, testeemp2) {
int retorno = 0;
switch (this.qtparametros) {
case 1:
retorno = emp1.getnome().compareTo(emp2.getnome());
break;
case 2:
retorno = emp1.getcidade().compareTo(emp2.getcidade());
if (retorno != 0) return retorno;
retorno = emp1.getnome().compareTo(emp2.getnome());
break;
default:
throw new RuntimeException("opcao invalida");
}
return retorno;
}
}
Obrigada
Você pode utilizar polimorfismo junto com o padrão Decorator http://en.wikipedia.org/wiki/Decorator_pattern que consiste em criar uma cadeia de operações, desta forma:
class Teste {
private String nome;
private String cidade;
// getters e setters
}
abstract class ComparadorDecorado implements Comparator<Teste> {
private ComparadorDecorado proximo;
public ComparadorDecorado(ComparadorDecorado proximo) {
this.proximo = proximo;
}
public int compare(Teste t1, Teste t2) {
int resultado = doCompare(t1, t2);
if (resultado == 0 && this.proximo != null) { // o primeiro filtro não é suficiente, passamos para o próximo se existir
resultado = this.proximo.compare(t1, t2);
}
return resultado;
}
public abstract int doCompare(Teste t1, Teste t2);
}
class ComparadorDecoradorNome extends ComparadorDecorado {
// construtor
public int doCompare(Teste t1, Teste t2) {
// não estou testando nulos para ficar um código menor
return t1.getNome().compareTo(t2.getNome());
}
}
class ComparadorDecoradorCidade extends ComparadorDecorado {
// construtor
public int doCompare(Teste t1, Teste t2) {
// não estou testando nulos para ficar um código menor
return t1.getCidade().compareTo(t2.getCidade());
}
}
// pode usar da seguinte forma
new ComparadorDecoradorNome(null); // só para nome
new ComparadorDecoradorCidade(null); // só para cidade
new ComparadorDecoradorNome(new ComparadorDecoradorCidade()); // para nome e cidade, respectivamente
não compilei o código, me desculpe se houver algum erro.
Acho q não me antende.
Vou ter mais de 18 filtros que o usuário pode escolher.
Aqui vc passou por nome, cidade, nome e cidade… a ordem é dinâmica.
Vou especificar melhor…
Atributos
-nome
-cidade
-profissao
-cpf
O usuario pode fazer várias combinações
nome + cidade
nome + profissao
nome + cpf
cpf+ nome + cidade + prof
nome
cidade + nome
e ai vai…
Obrigada
Digamos que você possua uma lista de chaves do tipo String selecionadas pelo usuário, via algum controle de seleção múltipla como checkboxes.
A idéia por trás do decorator é percorrer essa lista de trás para frente, decorando o Comparator final de forma que não seja necessário fazer muitos testes, exemplo:
ComparadorDecorado criaComparador(String opcao, ComparadorDecorado proximo) {
if (opcao.equals("nome") {
return new ComparadorDecoradoNome(proximo);
} else if (opcao.equals("cidade")) {
return new ComparadorDecoradoCidade(proximo);
}
...
...
}
List<String> opcoes = ...; // construído a partir da interface visual, na ordem inversa de importância
ComparadorDecorado comparador = null;
for (String opcao : opcoes) {
comparador = criaComparador(opcao, comparador);
}
// aqui vc possui uma instância de comparador dinâmica, de acordo com as escolhas do usuário