[Dúvida] ArrayList<SelectItem> - metodo contains(Object o)

3 respostas
J

Pessoal estou com um problema de performance em meu sistema por motivo de uma comparação que faço em uma lista.

Eu tenho uma lista que é preenchida com valores que vem da base de dados. Éste é um ArrayList<SelectItem>.

Eu queria saber como que eu faço para verificar se um elemento SelectItem existe dentro da lista com o contais sem precizar de loop (que é o modo que estou fazendo agora que está lento pois na base tem MUITOS registros e são preenchidos na lista).

os meus códigos são similares a estes:

Preenche lista:

listItem.add(new SelectItem("CORPORAT","CORPORAT"));
		
	for(InvE1TO r : listaInvE1TO) {
    		listItem.add(new SelectItem(r.getDesProjeto(),r.getDesProjeto()));
    	}

verifica se existe na lista:

//Faço esta verificação, pois se utilizar o .equals e o Desprojeto for nulo, causa erro de null pointer 
			if(this.getInvE1TO().getDesProjeto() != null){
				for(SelectItem item : listItem){
					if(this.getInvE1TO().getDesProjeto().equals(item.getValue().toString())){
						projetoExiste = true;

					}
				}
				// caso não exista o projeto na lista ele concatena com (Antigo)
				if (projetoExiste == false){
					this.getInvE1TO().setDesProjeto(this.getInvE1TO().getDesProjeto() + " (Antigo)");
				}
			}

deste modo que está acima funciona mas é lento pois ele varre a lista toda.

eu queria saber como posso customizar com um “contains(o)” para que eu possa deixar isto mais rápido.

eu tentei adicionar um break quando ele encontra o valor mas no caso de o valor procurado for o ultimo da lista ou não estiver na lista ele vai percorrer a lista toda da mesma maneira.

Agradeço desde já.

3 Respostas

ViniGodoy

Copie os select items para um HashSet. E depois use o contains do HashSet.
O tempo do hashSet é O(1), enquanto o da lista é O(n).

J

Usando o contains eu consegui, realmente houve uma melhoria significativa. Obrigado.

WellingtonRamos

Primeiro, no loop, ao encontrar o resultado esperado, usar break. Somente se o item desejado for o último item que a lista será completamente varrida.
Segundo, inverta o comparador. Creio que os itens adicionados na lista sempre terão valor diferente de null.
ao comparar objeto.equals(null), o retorno é false;

if( item.getValue().toString().equals(this.getInvE1TO().getDesProjeto()) ) {
    projetoExiste = true;   
    break;
}
Mas pergunto, o
listItem.contains(this.getInvE1TO().getDesProjeto())
não é melhor? De qualquer forma, segue:
List<String> listItem = new ArrayList<String>() {

			@Override
			public boolean contains(Object o) {
				//TODO Faça seu melhor ;)
				boolean result = super.contains(o); //Troque esta implementação
				return result;
			}
		};
Criado 9 de abril de 2010
Ultima resposta 9 de abr. de 2010
Respostas 3
Participantes 3