[RESOLVIDO]Lógica fazer consulta em arrayList - filter

6 respostas
W

Pessoal, tenho a seguinte situação…
quando minha classe é carregada pela primeira vez, ela tem um arraylist de String carregado.
Partindo deste ponto, preciso fazer o seguinte.
quando o usuário entrar com uma letra, eu preciso verificar em quais posições do meu array contém essas letras, e remover as demais. Bem como adicionar novamente as removidas, assim que o usuário fizer entrar com outra informação.

6 Respostas

R

Mantem esse primeiro array carregado como “fonte”.

Depois percorre sempre ele retornando um novo array só com as informações que você quer.

A cada nova pesquisa, percorre ele inteiro e retorna o novo com as informações desejadas.

Com o tempo, se você quiser pode maximizar a qualidade disso só consultando novamente o array “fonte” quando o usuário mudar uma letra que ja tinha informado, por exemplo.

A

Wilson,

Remover e adicionar novamente itens do ArrayList acho que é a estratégia errada.

O ideal é você trabalhar com dois ArrayList:

Algo como:

public List<String> list = new ArrayList<String>();
	
	public List<String> getByString(String filter){
		List<String> resultList = new ArrayList<String>();
		
		for(String item : list){
			if(item.contains(filter)){
				resultList.add(item);
			}
		}
		
		return resultList;
	}

Não esqueça de, se for o caso, colocar tratamento para não diferenciar maiúsculas de minúsculas através do método toUpperCase() (ou toLowerCase()) em ambos items do contains:

item.toUpperCase().contains(filter.toUpperCase())

E se o teu filter puder vir nulo, aí tem que adicionar tratamento de null.

Forte abraço!

W

Muito bacana sua idéia, vou tentar implementar aqui…
pra dificultar, terei que criar Array de matrix bidimensional de tamanho 5.
e verificar se contém o que foi digitado em cada posição da matriz…
ou seja, além de varrer cada posição do array, terei que dentro da posição x, varrer cada posição da matriz…

W

Galera, dá uma olhada como implementei.. dá pra melhorar?
Ps.: realmente, tenho que usar Vector e Char, ao invés de arraylist e contains.

import java.util.Vector;

public class Principal {

    Vector vector = new Vector();
    Vector vectorCopia = new Vector();

    public Principal() {
        vector.addElement(new String[]{&quot;bicicleta&quot;, &quot;123&quot;, &quot;grande&quot;});
        vector.addElement(new String[]{&quot;barco&quot;, &quot;456&quot;, &quot;pequeno&quot;});
        vector.addElement(new String[]{&quot;carro&quot;, &quot;789&quot;, &quot;médio&quot;});
        vector.addElement(new String[]{&quot;moto&quot;, &quot;000&quot;, &quot;minúsculo&quot;});
        vector.addElement(new String[]{&quot;avião&quot;, &quot;111&quot;, &quot;big&quot;});
    }

    public static void main(String args[]) {
        Principal prin = new Principal();
        prin.carregaTeste(&quot;y&quot;);
        prin.carregaTeste(&quot;b&quot;);
        prin.imprimeResultado();

    }

    private void imprimeResultado() {
        System.out.println(&quot;Resultado..&quot;);
        for (int i = 0; i &lt; vectorCopia.size(); i++) {
            String[] retorno = (String[]) vectorCopia.get(i);
            for (String t : retorno) {
                System.out.print(&quot;...&quot; + t);
            }
            System.out.print(&quot;\n&quot;);

        }
        vectorCopia.removeAllElements();
    }

      private void carregaTeste(String vlor) {
        try {
            char chrt;
            char chrv;
            boolean continuar = true;
            for (int i = 0; i &lt; vector.size(); i++) {

                String[] retorno = (String[]) vector.get(i);
                for (int x = 0; x &lt; retorno.length; x++) {
                    String t = retorno[x];
                    for (int y = 0; y &lt; t.length(); y++) {
                        continuar = true;                        
                        chrt = t.charAt(y);
                        for (int z = 0; z &lt; vlor.length(); z++) {
                            chrv = vlor.charAt(z);
                            if (chrt == chrv) {
                                vectorCopia.add(retorno);
                                continuar = false;
                                break;                                
                            }
                        }
                        if(!continuar){
                            break;
                        }

                    }

                }
            }
            
            System.out.print(&quot;\n&quot;);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
R

Eu particularmente não ficaria zerando o vectorCopia, usaria um vectorCopia = new Vector(); no início do método carregaTeste.

Mas se for manter assim, pode adicionar um final no vector e vectorCopia, afinal eles não vão mudar até o final (se for manter assim, sem usar minha sugestão).

Também não ficaria criando String[] retorno e String t dentro dos loops criaria elas uma única vez e depois mudaria os valores.

No resto acho que é mais ou menos isso mesmo.

W

Valeu rodrigo, fiz as alterações de limpar o vector e declarações das variáveis exatamente como você descreveu… acredito ganhar um pouco em desempenho nisto rs

Criado 4 de maio de 2012
Ultima resposta 4 de mai. de 2012
Respostas 6
Participantes 3