Duvida rapida ArrayList

10 respostas
I

Tenho 2 classes: Main e Produto.

Tenho na classe Main uma static public ArrayList lista.

A duvida é,
Como faço para checar se o codigo (int) que vai ser cadastrado já existi na List?

Ex)
1- Teclado
2- Mouse
|–> Essa é minha lista, ai vou cadastrar um novo produto e informo o codigo 2. Como faço pra detectar que esse codigo já existe?

Eu tentei usar lista.getcodigo == codigo, mas não consigo passar pra lista os metodos da minha outra classe. =/

Abraços =/

10 Respostas

Zeed01

Boa madrugada Galera !

Colega o arraylist oferece o metodo contains, ele retorna true caso o objeto passado exista na lista.
O teste seria algo como:

if (lista.contains(d)) 
         System.out.println("tem");
else
          System.out.println("nao tem");

Mas para que a comparação seja feita através do atributo da comparação “codigo” você deve reescrever o metodo “equals” no seu objeto Produto.
Algo como:

@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Produto other = (Produto) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		return true;
	}

Espero ter ajudado.

[]s

blackfalcon

Zeed01, o contais entao simula o for comparado ao intem passado como argumento?

Abraços

Zeed01

Bom dia Galera !

Sim… outra opção seria fazer um for e comparar cada item do arraylist, mas o contains ja faz isso pra você.

[]s

eberson_oliveira

Bom dia a todos.

A menos que seja obrigatório o uso de ArrayList, sugiro que utilize um Set, pois ele não permite duplicatas. Dessa forma não vai ser preciso fazer for e nem verificar com contains... é só adicionar... se o objeto já existir na lista o novo não será adicionado e o método retornará false, do contrário retornará true.

Set<Produto> lista = new HashSet<Produto>(); 

//ou, conforme proposto abaixo pelo colega
Set<Produto> lista = new TreeSet<Produto>();
.
.
.
if ( lista.add( produto ) ){
   System.out.println( "adicionou" );
}
else{
   System.out.println( "já existe um objeto semelhante a este na lista" );
}

Espero ter ajudado.

Esqueci de mencionar.... o método equals e hashCode deverão ser implementados para que a lista funcione da forma esperada com o desempenho esperado.

[]
Éberson

ViniGodoy

Se usar um TreeSet fica ainda melhor, já que a lista no final ainda sai ordenada. Entretanto pra usar o HashSet a classe deve implementar corretamente o hashCode e o equals e pra usar o TreeSet a classe deve ser Comparable.

eberson, você escreveu de tipar os set:

Set<Produto> produtos = new HashSet<Produto>();
eberson_oliveira

[quote=ViniGodoy]Se usar um TreeSet fica ainda melhor, já que a lista no final ainda sai ordenada. Entretanto pra usar o HashSet a classe deve implementar corretamente o hashCode e o equals e pra usar o TreeSet a classe deve ser Comparable.

eberson, você escreveu de tipar os set:

Set<Produto> produtos = new HashSet<Produto>();

Vixi… foi mal…

Acabei escrevendo direto na resposta e esquecendo desse detalhe.

Valew

[]s
Éberson

edmarr
eberson_oliveira:
Bom dia a todos.

A menos que seja obrigatório o uso de ArrayList, sugiro que utilize um Set, pois ele não permite duplicatas. Dessa forma não vai ser preciso fazer for e nem verificar com contains... é só adicionar... se o objeto já existir na lista o novo não será adicionado e o método retornará false, do contrário retornará true.

Set<Produto> lista = new HashSet<Produto>(); 

//ou, conforme proposto abaixo pelo colega
Set<Produto> lista = new TreeSet<Produto>();
.
.
.
if ( lista.add( produto ) ){
   System.out.println( "adicionou" );
}
else{
   System.out.println( "já existe um objeto semelhante a este na lista" );
}

Espero ter ajudado.

Esqueci de mencionar.... o método equals e hashCode deverão ser implementados para que a lista funcione da forma esperada com o desempenho esperado.

[]
Éberson

Muito bom comentario Eberson,
Enfim você pode usar algumas classes que implementam Set , vc pode trabalhar sem duplicata na sua lista.

I

Vlws pela ajuda, só que tenho +1 duvida.

Ex)
[Codigo/Nome]:
13 Camisa
21Shorts
(…)
9 Calça jeans

|-> Essa é minha ArrayList lista e eu quero criar um metodo para remover o produto passando o codigo do produto
*Só consegui fazer passando a posição =/

Obrigado! :-o

D

igones:
Vlws pela ajuda, só que tenho +1 duvida.

Ex)
[Codigo/Nome]:
13 Camisa
21Shorts
(…)
9 Calça jeans

|-> Essa é minha ArrayList lista e eu quero criar um metodo para remover o produto passando o codigo do produto
*Só consegui fazer passando a posição =/

Obrigado! :-o

Eu acredito que o ArrayList não seja o mais indicado para isso.
Dê uma pesquisada sobre Set, acho que vai atender melhor sua necessidade

eberson_oliveira

igones:
Vlws pela ajuda, só que tenho +1 duvida.

Ex)
[Codigo/Nome]:
13 Camisa
21Shorts
(…)
9 Calça jeans

|-> Essa é minha ArrayList lista e eu quero criar um metodo para remover o produto passando o codigo do produto
*Só consegui fazer passando a posição =/

Obrigado! :-o

Primeira coisa a se fazer… troque seu ArrayList por um Set como foi mostrado acima. Não esquecendo que para isso deverá implementar equals e hashCode no seu objeto Produto (Se estiver utilizando uma IDE, ela tem opções para implementar este método para você). Provavelmente o que define um produto deve ser o código, logo ele será o valor a ser comparado no equals; assim, acredito que você poderia criar um objeto apenas com o código do produto a ser removido e mandar remover da lista.

Não tenho certeza de que é a melhor solução. Mas deve funcionar no seu caso.

[]
Éberson

Criado 14 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 10
Participantes 7