Preciso separar (sem ficar percorrendo a lista toda), por exemplo todas as pessoas de determinada religião. Poderia resultar numa outra lista, ou algo que eu possa percorrer somente os objetos filtrados.
Seria bom algo do tipo:
iterator it = listaPessoas.findBy(religiao, 3) //onde 3 é a religião que estou buscando… :>
Essa é uma das deficiências do Java (não ser muito adequado para processamento de listas).
Que eu saiba, você vai ter de fazer isso “na mão” - percorrer todos os elementos e gerar uma nova lista, ou então criar uma classe que implementa a interface Iterator ou Iterable.
Se você sabe que a lista pode ser ordenada por algumas chaves, você pode tentar usar TreeMap ou HashMap.
L
larini
Não precisa realmente ser uma lista, pode ser qualquer estrutura em java onde possa colocar objetos e depois recuperá-los de forma rápida…
Como eu poderia usar esses dois caras?
T
thingol1 like
Você pode organizar uma coleção de objetos usando TreeMap ou HashMap.
Dada uma chave, você pode obter o valor. Por exemplo: "catolica" -> Pessoa ("Jose Aparecido", "catolica", "25/12/1990").
O problema de TreeMap e HashMap é que no seu caso muitos valores terão a mesma chave, e você precisaria fazer um TreeMap ou HashMap de listas de Pessoa, não de Pessoa.
Vou dar um exemplo completo.
iimportjava.util.*;classPessoa{publicStringnome;publicStringreligiao;publicStringendereco;publicPessoa(Stringnome,Stringreligiao,Stringendereco){this.nome=nome;this.religiao=religiao;this.endereco=endereco;}publicStringtoString(){return" < nome="+nome+", religiao="+religiao+", endereco="+endereco+" > ";}}publicclassExemploMapa{privateList<Pessoa>pessoas;privateMap<String,List<Pessoa>>pessoasPorReligiao;publicvoidteste(){pessoas=newArrayList<Pessoa>();pessoas.add(newPessoa("Jose Aparecido","catolica","R. das Azaleas, 22"));pessoas.add(newPessoa("Takashi Abe","budista","R. das Betulas, 23"));pessoas.add(newPessoa("John Smith","protestante","R. dos Carvalhos, 25"));pessoas.add(newPessoa("Severino Cavalcanti","catolica","R. das Dracenas, 26"));// Criando o mapa "pessoasPorReligiao"pessoasPorReligiao=newTreeMap<String,List<Pessoa>>();for(Pessoapessoa:pessoas){List<Pessoa>pessoasComMesmaReligiao;if(!pessoasPorReligiao.containsKey(pessoa.religiao)){pessoasComMesmaReligiao=newArrayList<Pessoa>();pessoasPorReligiao.put(pessoa.religiao,pessoasComMesmaReligiao);}else{pessoasComMesmaReligiao=pessoasPorReligiao.get(pessoa.religiao);}pessoasComMesmaReligiao.add(pessoa);}// Agora vamos listar as pessoas com religião católicaSystem.out.println(pessoasPorReligiao.get("catolica"));// Vamos listar as pessoas com religião protestanteSystem.out.println(pessoasPorReligiao.get("protestante"));}publicstaticvoidmain(String[]args){ExemploMapamp=newExemploMapa();mp.teste();}}
L
larini
Valeu pela dica. Sabe me dizer se o Hibernate faz algo parecido com isso ai?
sergiotaborda
larini:
Olá, criei uma lista com milhares de objetos de uma mesma classe, e agora preciso filtrar isso por algumas propriedades desta classe.
ex.:
(…)
Vc precia de um filtro
interfaceFilter{booleanaccept(Objectobj);}classFilterUtils{publicstaticCollectionfilter(Collectioncol,Filterfilter){Collectionresult=newArrayList();for(Iteratorit=col.iterator();it.hasNext();){Objectobj=it.next();if(filter.accept(obj)}result.add(obj);}}returnresult;}}// uso Collectionres=FilterUtils.filter(listaPessoas,newFilter(){publicbooleanaccept(Objectobj){return((Pessoa)obj).getReligiao()==3;}});// res contém pessoas cuja religiao é 3
L
larini
Sergio, pelo que parece esse método vai percorrer toda a lista, algo que eu não posso fazer.
sergiotaborda
:lol: O método o Tingol tb precorre toda a lista e vc acho maravilhoso.
Cara, não tem como não precorrer toda a lista usando java puro e dada um lista pre-carregada!!!
A única forma de não precorrer toda a lista é trazendo do banco de dados a lista já filtrada ou pre-classificar os dados.Ao pre-classificar vc não usa um List, mas um objeto proprio que pre-classifique os dados de certa forma pre-definida como o tingol mostrou ( usando mapas de listas) mas fazendo isso no Add e não num for. Mas o problema da pre-classificação é que ela resolve os caso mais usados, não resolve todos os casos. É uma especie de cache dos casos mais comuns.