Dúvida método contains

Eu estou com um problema para entender o ArrayList e a aplicação de seus métodos. em especial o alcanse do ArrayList.contains()
Eu tenho uma estrutura de dados que possui alguns ArrayLists (objetodaminhaclasse). esse (objetodaminhaclasse) possui um nome (static int) para cada objeto que for criado poder ser identificado. E a estrutura de dados possui um metodo Search que busca dentro da "ArrayList(objetodaminhaclasse) “um” (objetodaminhaclasse) através de seu nome. ou seja:

boolean Search(int nome)
{

    if(ArrayList.contains(??)
        return true;
    else
       return false;
}

seria possível ser feito dessa maneira acima ou eu deveria utilizar o for para percorrer todos os indices chamando o método do (objetodaminhaclasse) que retorna o nome?

1 curtida

Se entendi, você pode fazer assim:

return seuArray.contains(objetoProcurado);

Se o objeto procurado existir no seu array, retornará true, senão retornará false.
Repare que o método contains(obj) retorna um boolean, então você não precisa do if. Pode retornar direto, pois o valor só pode ser true ou false.

certo, obrigado igor. mas a minha dúvida é a respeito do funcionamento do metodo contains. então veja se o meu entendimento sobre ele está correto:

  • este meuArray só possui 1 tipo de objeto de uma classe que eu fiz.(vamos chama-la de “meuobjeto”)
  • este meuArray possui vamos supor, 500 “meuobjeto” que possuem .nome diferentes.
  • cada um “meuobjeto” sai do array pelo metodo .get() e passa por uma análise automatica.
  • depois ele é retornado com suas variáveis alteradas. apenas o “meuobjeto”.nome permanece igual.
  • depois eu preciso encontrar esse objeto pelo nome no “meuArray” para compara-lo com o objeto alterado que possui o mesmo nome mas variáveis diferentes.

A pergunta é:
como o método meuArray.contains(ObjetoProcurado) vai saber que os dois objetos são o mesmo se a única coisa igual entre os dois é o “meuobjeto”.nome?

na verdade o que eu quero saber é se o meuArray.contains é capaz de fazer essa busca através de:
return meuArray.contains(meuobjeto.nome);

1 curtida

Acho que você não entendeu bem o funcionamento do List (ArrayList/ LinkedList/ etc).

O List basicamente armazena uma coleção de endereços de memória objetos (endereços da JVM), não o objeto em si. Quando você mantém fora da lista uma referência (variável) para um objeto que está na lista, e altera o objeto através dessa referência, o objeto dentro da lista também é alterado porque é o mesmo objeto, não um objeto diferente. Mesmo que você faça get(), o objeto permanece dentro da lista.

Um exemplo com código:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
	public void testaTudo(){
		List<ClasseTeste> lista = new ArrayList<ClasseTeste>();
		
		ClasseTeste teste1 = new ClasseTeste("Joao", 100);
		
		teste1.imprimir(); 
		
		lista.add(teste1); // adiciona teste1 na lista
		// note que a variável teste1 ainda está apontando para um objeto do tipo Classeteste
		// o valor não some automaticamente
		
		teste1.imprimir(); // imprime a mesma coisa que da primeira vez
		
		ClasseTeste teste2 = new ClasseTeste("Pedro", 200);
		
		teste2.imprimir(); // imprime Pedro
		
		lista.add(teste2); // adiciona teste2 na lista
		
		// daí podemos fazer:
		
		lista.get(0).imprimir(); // imprime o Joao, que foi o primeiro adicionado à lista
		lista.get(1).imprimir(); // imprime o Pedro
		
		ClasseTeste teste3 = lista.get(0); // coloca em teste3 o primeiro elemento da lista : Joao
		// note que o elemento não é removido da lista
		
		teste3.setValor(300);
		
		teste3.imprimir(); // imprime o Joao, mas com valor 300
		teste1.imprimir(); // também imprime Joao, e com valor 300
		
		lista.get(0).imprimir(); // tambem imprime Joao, e com valor 300
		
		// Nós não mudamos a referência da variável teste1, então 
		// tanto teste1 quanto teste3 e lista.get(0) retornam o mesmo objeto.
		
		// inclusive, podemos fazer:
		lista.get(0).setValor(500);
		
		lista.get(0).imprimir(); // Joao, com valor 500
		teste1.imprimir(); // Joao, com valor 500
		
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		
		new Ideone().testaTudo();
	}
	
	class ClasseTeste{
		String nome;
		int valor;
		
		public ClasseTeste(String nome, int valor){
			this.nome = nome;
			this.valor = valor;
		}

		// permite alterar o valor
		public void setValor(int novovalor){
			this.valor = novovalor;
		}

		// exibe nome e valor
		public void imprimir(){
			System.out.println("Nome : " + this.nome + "  Valor : " + this.valor);
		}
	}
}

Veja em http://ideone.com/23yO7u . E recomendo a leitura : https://www.caelum.com.br/apostila-java-orientacao-objetos/collections-framework/

O contains basicamente faz uma busca pelo objeto inteiro (não por um atributo, com nome). Baseado no meu código, seria algo assim:

lista.contains(teste1); // retorna true, o objeto referenciado por teste1 está na lista
ClasseTeste teste4 = new ClasseTeste("Mateus", 700);
lista.contains(teste4); // retorna false, o objeto referenciado por teste4 não está na lista

Se você quer fazer a busca por nome dentro do List, precisaria percorrê-la (for, while, …) e comparar o nome de cada elemento com o nome que você está procurando. Ou pode usar um HashMap e usar o nome como chave, o que torna a busca bem mais fácil, mas é preciso ver o que você deseja obter ante de simplesmente trocar de biblioteca.

Abraço.

Quando você faz seuArray.get(seuObjeto), o seuObjeto não sai do array, ele apenas copia o endereço de memória de onde o objeto de fato está.
Ao alterar seus valores “do lado de fora do array”, você continua trabalhando com o endereço de memória/referência desse objeto, ou seja, trabalha no mesmo objeto que está dentro do array.

Essa pergunta não faz muito sentido pois não existem dois objetos, existe apenas um. Talvez com mais de uma variável que aponte para ele, mas existe apenas um objeto (que está na memória).

Mas acho que agora entendi o que você quer fazer.
Você quer procurar um objeto dentro de um array através de um atributo (ex: nome), correto?

Dessa forma você precisará iterar o array inteiro e verificar cada um para saber se o atributo é igual.
Ex:

for(SeuTipo temp : seuArray) {
    if(temp.getSeuAtributo().equals("seuValorDeComparação")) {
        return true;
    }
}
return false;

Sendo que getSeuAtributo() é o getter do seu atributo e que esse atributo é String.
Na verdade esse if você pode implementar da forma que bem entender, para comparar os tipos que desejar.
Acho que o tipo do seu nome é int, né?
Então substitua aquele if por esse:

if(temp.getSeuAtributo() == seuValorDeComparacao)

É isso o que você quer?

certo. obrigado TerraSkilll. bem só para resumir.
no meu caso, o metodo meuArray.get(x) copia o meuobjeto para um meuobjeto auxiliar.
então eu faço alterações no meuobjeto auxiliar e depois o comparo com o objeto armazenado em meuArray.get(x);

  • os dois são o mesmo tipo, variavel “nome” iguais, outras variaveis diferentes.
    mas pela sua explicação me parece que vou precisar mesmo percorrer a lista.
    obrigado também pelo material. a dúvida está esclarecida.

igor. então no caso, se este objeto, independentemente da variável da qual eu o aponte fora do array é o mesmo, então ao fazer modificações no objeto que o array me apontou eu não preciso armazena-lo de novo?

1 curtida

Outra dúvida, ao usar:

public Object search(int valor)

for(Object temp : array) {
if(temp.nome == valor) {
return temp;
}
}
return null;
}

eu estarei retornando com essa busca o endereço da memória onde o objeto com o nome = valor está armazenado?

Exato.

Isso.

Em Java, sua variável nunca contém o objeto de fato. Ela apenas armazena o endereço de memória de onde o objeto está.
Para exemplificar, crie uma outra classe chamada Teste.
Apenas crie-a e instâncie-a em uma outra classe.
Chame o método toString() dela e veja o que é impresso.
O código estranho depois do arroba é o endereço de memória dela.

certo. valeu cara, isso esclareceu coisas demais. o meu codigo estava cheio de erros por isso …

1 curtida