Problema ao copiar elementos de ArrayList para outra ArrayList [Resolvido]

6 respostas
A

Ola pessoal,

Estou com uma duvida, gostaria de saber o porque ocorre a copia indevida de valores em listas completamente distintas.
Em seguida, o meu codigo e a explicação do que exatamente ocorre.

public DualListModel<Atividade> pickListAtividades() {

		List<Atividade> target = getAtividades();
                List<Atividade> source = getAtividades();
		
		DualListModel<Atividade> dualAtividades;
		
		//link of Task (selected) and Activity on Task map,
		//     working like a memory for activities changes on pickList (primefaces), deleted and added
		if (mapTarefa.containsKey(tarefa)){
			dualAtividades = mapTarefa.get(tarefa);
			return dualAtividades;
		}else{
			Collection<DualListModel<Atividade>> coll = mapTarefa.values();
			List<DualListModel<Atividade>> listDualList = new ArrayList<DualListModel<Tarefa>>(coll);
			for (DualListModel<Atividade> dualListModel : listDualList) {
				List<Atividade> _target = dualListModel.getTarget();
				for(Atividade ac : _target) {
					target.add(ac);
				}
                                List<Atividade> _source = dualListModel.getSource();
                                for(Atividade ac : _source){
                                        source.add(ac);
                                }
			}
			dualAtividades = new DualListModel<Atividades>(source,target);
			return dualAtividades;
		}
	}
Bem, o resultado do topico é visto nessa linha do codigo:
dualAtividades= new DualListModel<Atividades>(source,target);
O que acontece, bizarramente, é a copia indevida de valores de uma lista para a outra, sendo que não estou realizando nenhuma operação entre essas listas. Apos debugar o codigo percebi que a cada iteração do primeiro for (1) ela realiza a copia dos elementos "adicionados" na lista target para a lista
dualListModel.getSource()
(1)
for(Atividade ac : _target) {
	target.add(ac);
}

Quando é feito a copia dos elementos da lista _source para a lista source, é realizado a copia dos mesmos valores que tem a lista _target.

Alguém poderia me explicar o que ocorre e o porque ?

Muito obrigado.

(espero que a pergunta tenha ficado clara, qualquer duvida so perguntar)

6 Respostas

fabiocortolan

Cara, nunca utilizei DualListModel, mas me parece q no início do código vc está atribuindo a mesma lista para “target” e para “source”, essa parte não está errada?

List&lt;Atividade&gt; target = getAtividades(); // target e source possuem os mesmos valores
List&lt;Atividade&gt; source = getAtividades();
A

Então fabiocortolan,

Olha so…

getAtividades() ira retornar uma lista.

public List<Activite> getActivites() { if (activites == null ){ activites = new ArrayList<Activite>(); } return activites; }

Então, então creio eu que não ha sentido dar problema ai.

O problema é na DualListModel, pois no mesmo momento que eu copio os elementos da lista _target para target, os elementos são copiados de _target para _source (isso eu vi durante o debug na DualListModel).

fabiocortolan

Acho q vc mesmo já respondeu seu problema! Qdo vc chama “getAtividades()”, vc verifica se “activites” é null, como essa variável está na mesma instância dos outros métodos q vc postou a primeiva vez ela é null, já na segunda ela possui a mesma instância, nesse caso target e source possuem a mesma instância da lista “activites”, nesse caso qdo vc modifica target, source será modificado tbm e vice versa. Vou comentar os códigos para tentar esclarecer melhor:

public List&lt;Activite&gt; getActivites() {  
    if (activites == null ){  
        activites = new ArrayList&lt;Activite&gt;(); // código executado em "target"
    }  
    
    return activites; // código executado em "source" - retorna a mesma instância da lista de target
}

// ...
List&lt;Atividade&gt; target = getAtividades(); // Aki ele entra dentro do if, já que "activites" é null
List&lt;Atividade&gt; source = getAtividades(); // Aki ele pegou a mesma lista de cima, já  "activites" não é mais null
A

Rapaz, e não é que funcionou mesmo ?

Inicializei ambas as listas com o new ArrayList(); e funcionou.

O sistema se tornou grande e não prestei atenção a esse detalhe quando voltei pra essa parte do desenvolvimento.

Muito obrigado por ter feito atenção à isso !

E qual o problema com a DualListModel ?

fabiocortolan

andrielc:


E qual o problema com a DualListModel ?

Não sei se existe algum problema em usar DualListModel, até hj eu não tinha visto nada a respeito dessa API…

A

Ah, ok.

Utilizei ela para reduzir a quantidade de variavel e se tornou util para o que eu realizei, como a operação de memoria.

Obrigado.

Criado 22 de julho de 2013
Ultima resposta 22 de jul. de 2013
Respostas 6
Participantes 2