Duvida em ArrayList

12 respostas
thiagotbo

Olá Gujnautas, to com a seguinte dúvida:

Tenho um objeto ‘Produto’, e ele tem vários atributos(como preco, quantidade em estoque e etc…), criei uma ArrayList pra armazenar vários destes ‘produtos’, mas agora vou precisar acessar cada objeto independente para poder mudar seus atributos.

Exemplo: Inseri na lista um produto que o preco dele era 10, mas o preco do produto baixou para 8, como faço pra acessar o objeto dentro do ArrayList e mudar seu atributo preco(levando em conta que o objeto produto ja tem um método setPreco) ?

Eu tinha pensado em usar o ‘get’ pra pegar o produto a ser alterado, jogar em uma outra variável auxiliar do tipo produto, fazer a alteração, e depois devolver para o ArrayList, mas pelo que eu intendi, ele vai criar um novo produto dentro do ArrayList, e não simplesmente sobrescrever o que eu quero modificar.

12 Respostas

sergiotaborda

Os objectos dentro de uma colecção continuam sendo eles mesmos

Produto p = new Produto();
p.setNome("A");

List<Produto> list = new ArrayList<Produto>();
list.add(p);

p.getNome (); // o nome é A
list.get(0).getNome()  // o nome é A

// alterando o produto. 
p.setNome ("B"); 

p.getNome (); // o nome é B
list.get(0).getNome()  // o nome é B


// alterando o produto directamente da lista
list.get(0).setNome ("C"); 

p.getNome (); // o nome é C
list.get(0).getNome()  // o nome é C
ramilani12

Exatamente o ArrayList aceita duplicatas se vc adicionar a mesma referencia de um produto no ArrayList ele não irá sobrescrever o Produto já existente no ArrayList

Aconselho a usar um HashMap ou Set que nao aceita duplicatas

Ex com HashMap
Um HashMap é um mapa , pares de valores esse mapa é constituído por uma chave e um valor , essa chave indica o valor correspondente

vamos supor que a nossa chave seja o Nome do Produto mais Preço

Map produtos = new HashMap();

Produto p = new Produto();
p.setNome("Maça");
p.setvalor("10.0");

produtos.put(p.getNome()+p.getValor() , p);


for (int i = 0; i &lt produtos.size(); i++)

{

        if (map.containsKey(("Maça"+"10.0")) // metodo para encontrar chave existente
        {
           Produto p = (Produto) produtos.get("Maça"+"10.0"); // buscando a referencia encontrada com a chave
           p.setPreco(20.0);
           produtos.put("Maça"+"10.0" , p); // adicioando o produto no map
           break;
       }

}
thiagotbo
// alterando o produto directamente da lista
 list.get(0).setNome ("C");
 
 p.getNome (); // o nome é C
 list.get(0).getNome()  // o nome é C

Hummm... Era Exatamente isso que eu precisava... Vlw D+ ! ! !

H

Somente se atente a um detalhe , na List ou ArrayList , você pode ter produtos repetidos.

Imagine que você terá que pegar o objeto Produto que você deseja pelo código, para que você possa alterar a informação desejada. Do jeito que você fez mesmo.

Agora igual ao amigo ramilani12 disse fica de uma maneira mais organizada.

De uma pesquisada , para constatar .

thiagotbo

Aêee Galera...

Tô tentando fazer da maneira que o nosso amigo sergiotaborda me explicou, mas tah dando erro, segue um pedaço do código abaixo(ainda não terminado):

import java.util.*;

class estoque 
{
	private ArrayList lista;
	private int codProd;
	private int qtdProdEst;
	private int qtdItemEst;
	private double vlrTotalEst;

    estoque()
	{
		ArrayList lista = new ArrayList();
		this.codProd = 0;
		this.qtdProdEst = 0;
		this.qtdItemEst = 0;
		this.vlrTotalEst = 0.0;
	}

	public void insereProduto() //int cod, String nome, int qtd, double preco
	{
		this.codProd = codProd + 1;
		String nomeProd = "Banana";
		int qtdProd = 10;
		double precoProd = 2.50;
		produto prod = new produto(codProd, nomeProd, qtdProd, precoProd);
		lista.add(prod);
	}

	public double saidaProd(String nome, int quant)
	{
		for (int i = 0; i != lista.size(); i++ )
		{
			String aux = lista.get(i).getNome();
			if(aux == nome)
			{
				double preco = lista.get(i).vender(quant);
				if(preco != 0.0)
					return preco;
			}
		}
	}
}

Tah dando o erro:

---------- Compilar_JAVA ----------
estoque.java:34: cannot find symbol
symbol  : method getNome()
location: class java.lang.Object
			String aux = lista.get(i).getNome();
                                              ^
estoque.java:37: cannot find symbol
symbol  : method vender(int)
location: class java.lang.Object
				double preco = lista.get(i).vender(quant);
                                                        ^
Note: estoque.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors

Output completed (1 sec consumed) - Normal Termination
sergiotaborda

Vc tem que declarar ArrayList e não apenas ArrayList. Isto SÒ funciona em java 5 ou superior. Para o java 1.4 e anterior vc deixa a declaração como está e usa

((Produto)lista.get(i)).getNome();

nota: pelo codigo vc quer encontrar o produto pelo nome.
Então o melhor é usar Map como HashMap em vez de list.

thiagotbo

Opa…

Vlw D+ sergiotaborda… deu certo… o engraçado é que antes eu estava fazendo da seguinte maneira dentro do construtor:

ArrayList<produto> lista = new ArrayList<produto>();

E teoricamente era pra funcionar também não era não ?

Ah outra coisinha, eu ja comecei a fazer ele com o HashMap também, só que ja tava virando pra mim uma questão de honra fazer ele rodar com o ArrayList hehehe… senão eu num ia aprender a usar esse recurso neh !

Noh + tah rodando até agora, vou tentar finalizar ele aki, Vlw D+ a todos !!!

ramilani12
sergiotaborda:
Os objectos dentro de uma colecção continuam sendo eles mesmos
Produto p = new Produto();
p.setNome("A");

List<Produto> list = new ArrayList<Produto>();
list.add(p);

p.getNome (); // o nome é A
list.get(0).getNome()  // o nome é A

// alterando o produto. 
p.setNome ("B"); 

p.getNome (); // o nome é B
list.get(0).getNome()  // o nome é B


// alterando o produto directamente da lista
list.get(0).setNome ("C"); 

p.getNome (); // o nome é C
list.get(0).getNome()  // o nome é C
herbertins

eh muito simples cara, o arraylist tem um metodo implementado que eh o get(); ele pega o item pelo codigo entao eh soh vc fazer

[color=red]list.get.setSalario[telefone removido]) [/color]

sendo que o get(1) pega a referencia para o objeto que tah na posiçao um

falow abs

anderson.uem

Pessoal sou iniciante e estou com um problema, é o seguinte eu preciso criar uma lista, mas nao estou conseguindo fazer isso, estive pesquisando e estou tetando fazer com um ArrayList, mas nao esta nem compilando, alguem pode me ajudar?

Obrigado

anderson.uem

esqueci de dizer, o meu codigo da erro nos sinais “<>”

alguem sabe me dizer o pq?

LuizLG

anderson.uem:
esqueci de dizer, o meu codigo da erro nos sinais “<>”

alguem sabe me dizer o pq?


Qual o erro?

Criado 3 de março de 2007
Ultima resposta 15 de mar. de 2007
Respostas 12
Participantes 7