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?
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;
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.
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.
Mas foi a primeira coisa que eu postei.
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.