[quote=Lavieri]Existe alguma forma facil de fazer uma pesquisa em Coleções ??
por exemplo… digamos que eu tenha uma lista de objetos “Carro” que contem diversas propriedades… e eu queira, filtrar de uma lista, os carros com KM acima de X, que tenham 4p, que sejam da montadora Y … conciderando que carro contem todas essas propriedades… há alguma forma facil de fazer essas pesquisas ?? com Collection ??
A unica forma é percorrendo toda a lista ? verificando cada propriedade, implementando os testes ?? imagino que aquele padrão Criterion possa funcionar bem pra isso… mais eu não peguei bem o esperito da coisa, e como implementar ele de forma facil =/[/quote]
Para pesquisar uma coleção pura ( uma coleção na memoria com objectos) a opção mais simples é usar o padrão Filter.
este padrão é muito simples, mas a perfomance não é muito boa porque implica em interar todos os elementos da coleção (afinal, sem os iterar como saber se passam ou não no filtro ?)
O padrão é simples . cria-se uma interface Filter com o método
interface Filter<T> {
public boolean match (T object):
}
e um método que faz a pesquisa
Este método recebe um colection e retira todos os elementos que não casam com o filtro. Esta opção é mais rápida que criar outra coleção. Criar outra coleção que é a copia da primeira , retirar os elementos que não casam e retornar essa coleção tb é uma opção, mas menos rápida.
public static <T>void filter ( Collection <T> candidates, Filter<T> filter ){
for (Iterator it = candidates.iterator(); it.hasNext(); ){
if (!filter.match(it.next()){
it.remove();
}
}
}
Agora, o filtro pode ser implementado como quiser, por exemplo
[code]Collection all = … // obtem
CollectionUtils.filter ( all , new Filter{
public boolean match (Carro carro ){
return carro.getPortasCount()==4 && carro.getKM() == 20;
}
}[/code]
É claro que vc pode criar uma classe que implemente Filter e tenha os parametros costumizáveis