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.
[RESOLVIDO]Lógica fazer consulta em arrayList - filter
6 Respostas
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.
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!
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…
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[]{"bicicleta", "123", "grande"});
vector.addElement(new String[]{"barco", "456", "pequeno"});
vector.addElement(new String[]{"carro", "789", "médio"});
vector.addElement(new String[]{"moto", "000", "minúsculo"});
vector.addElement(new String[]{"avião", "111", "big"});
}
public static void main(String args[]) {
Principal prin = new Principal();
prin.carregaTeste("y");
prin.carregaTeste("b");
prin.imprimeResultado();
}
private void imprimeResultado() {
System.out.println("Resultado..");
for (int i = 0; i < vectorCopia.size(); i++) {
String[] retorno = (String[]) vectorCopia.get(i);
for (String t : retorno) {
System.out.print("..." + t);
}
System.out.print("\n");
}
vectorCopia.removeAllElements();
}
private void carregaTeste(String vlor) {
try {
char chrt;
char chrv;
boolean continuar = true;
for (int i = 0; i < vector.size(); i++) {
String[] retorno = (String[]) vector.get(i);
for (int x = 0; x < retorno.length; x++) {
String t = retorno[x];
for (int y = 0; y < t.length(); y++) {
continuar = true;
chrt = t.charAt(y);
for (int z = 0; z < vlor.length(); z++) {
chrv = vlor.charAt(z);
if (chrt == chrv) {
vectorCopia.add(retorno);
continuar = false;
break;
}
}
if(!continuar){
break;
}
}
}
}
System.out.print("\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
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.
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