Valor da lista sendo alterado na memória

6 respostas
jonsistemas

Meu problema é basicamente o seguinte:

Tenho essas duas listas da mesma classe.

ArrayList<P> p2 = new ArrayList<P>();
ArrayList<P> p3 = new ArrayList<P>();

O que acontece é que quando faço esta operação:

for(int k=0; k<getF(); k++)
			{
				for(int i=0; i<NumFilhos; i++)
				{
					for(int j=0; j<NumFilhos; j++)
					{
						if(p2.get(j).getF().get(k).equals(listFs.get(k).get(i)))
						{
							
					        p3.add(p2.get(j)); 
                            p2.get(j).getF().set(k, -1.);
							break;
						}
					}
				}
			}

os valores de p3 sofrem a operação feita em p2, mesmo com a operação sendo feita depois.
Ao meu entender, é porque as variaveis de p2 possuem o mesmo endereço de memória de p3, porém como eu consigo adicionar o valor de p2 a p3, e alterar somente p2? Tem como fazer o p3 e p2 possuirem endereços de memoria diferentes? Ou alguma forma de adicionar os valores de p2 a p3 e alterar p2 sem que p3 também sofra as alterações?

6 Respostas

jonsistemas

Resolvi mas não sei se é a opção ideal, sobrescrevi o método clone na classe:

@Override 
	public P clone() 
	{ 
		P novo = new P(); 
		novo.setDist(getDist());
		novo.setId(getId());
		novo.setNp(getNp()); 
		for(int i=0; i<getF().size(); i++)
		{
			novo.addF(getF().get(i));
		}
		for(int i=0; i<sp.size(); i++)
		{
			novo.addP(i);
		}
		return novo;
	}
}

Alterando é claro em cima:

public class P implements Comparable<P>, Cloneable

E a parte do codigo ficou assim:

P aux = new P();
						aux = p2.get(j).clone();
						p3.add(aux); // 
						p2.get(j).getF().set(k, -1.);
						break;
staroski

Criando 2 instâncias.

jonsistemas

Mas eles são duas instancias, porem que possuem campos identicos e apontam para o mesmo endereço de memoria, o que acabou fazendo com que eles fossem instancias iguais, mas pelo visto clonar foi a melhor opção.

staroski

Não, se apontam para o mesmo endereço de memória então não são duas instâncias. É uma instância com duas referências.
Posta o código onde você inicializa essas variáveis.

jonsistemas

Mas foi a primeira coisa que eu postei.

staroski

Isso aí é a instanciação do ArrayList.
Onde é que você instancia os objetos que são inseridos nele?
Provavelmente estás adicionando as mesmas instâncias dos objetos em ambas as listas.

Criado 19 de junho de 2019
Ultima resposta 21 de jun. de 2019
Respostas 6
Participantes 2