Copiando ArrayList e seus objetos

Galera estou com problemas, eu tenho um ArrayList e preciso de uma copia exata dele e dos elementos dentro dele para fazer algumas alterações e exibi-las, porém eu não posso alterar os objetos e nem o Array original…
Alguem tem alguma sugestão de métodos seguros e otimizados de se fazer ?
A única alternativa que encontrei ( na verdade foi um amigo no trampo que teve esse problema ) foi criar uma nova instancia de um ArrayList (cópia )e iterar o array original passando elemento por elemento do original pra cópia.

Inicialmente tentei utilizar o método .clone(), mas ele cria apenas uma nova instancia do ArrayList e não dos seus elementos, portanto ele referencia os objetos dai quando eu os alterava eles alteravam os objetos no Array original também.

Se alguem tiver alguma sugestão ou comentário será muito bem vindo :stuck_out_tongue_winking_eye: … vlw

Acho que dá para combinar o toArray() do ArrayList com um System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length), que irá copiar o conteúdo para um outro array. Daí você usa Arrays.asList(T… a) para fazer o conteúdo copiado virar um List também.

Inté.

Amigo, encontrei outra solucao, pode ser melhor que iterar manualmente a lista inserindo os elementos da outra. Crie uma lista usando new, e adicione os elementos da outra usando a API , metodo addAll. Veja o exemplo:

ArrayList< String > a1 = new ArrayList< String >();
a1.add( “a” );a1.add( “b” );a1.add( “c” );

ArrayList< String > a2 = new ArrayList< String >();
a2.addAll( a1 );

a2.remove( 1 );
System.out.println(a2);
System.out.println(a1);

resultado:
[a, c]
[a, b, c]

Espero ter ajudado, abraco !

Humm, galera e se por acaso eu tiver um array … com elementos cujos atributos eventualmente podem ser um array tbm … esse metodo do copy vai me dar uma copia disso também ? ou esse array ( atributo ) vai ser uma referencia ao original ?

System.arraycopy() apenas copia as referências caso o Array seja de não-primitivos.

Possível solução: Usar new para criar novas instâncias dos objetos no Array que seria a cópia do outro Array.

Inté.

Olá

[quote=minha palestra JustJava2006]
Cópias de arrays

Antes do Java 6 era possível converter um array em um List, ordená-lo, fazer busca binária, verificar igualdade, gerar um hash code e mostrar seus elementos dentro de uma String separados por vírgulas.

Antes:
int[] newArray = new int[newLength];
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);

Agora seus problemas acabaram!
int[] newArray = Arrays.copyOf(a, newLength);

Há versões do método copyOf() para cada um dos primitivos e mais uma para objetos: static <T> T[] copyOf(T[] original, int newLength)

Se pode copiar também apenas uma parte dos arrays usando copyOfRange() que também versões análogas às de copyOf()

Antes do Java 6, para copiar um array só havia a alternativa de usar: System.arraycopy(Object src, int srcPos, Object dest, int destpos, int length)
Precisava alocar espaço para o novo array antes de usar este método estático.[/quote]

Fonte: http://www.guj.com.br/posts/list/47362.java#247549

A cópia é do conteúdo do Array. Se o Array contém referências, elas serão copiadas.

[]s
Luca

É pois é meu problema é esse mesmo, eu tenho referencias e preciso de copias dos objetos que são referenciados e nao das referencias…

Usar new pra cada elemento requer que eu conheça seus atributos para poder seta-los … ou nao ?
vlw

Olá

É fácil de fazer:

a) Para uma caso particular de um array seu que você conhece os tipos escreva métodos particularizados

b) Para casos gerais use Reflection

[]s
Luca

:twisted:[quote=muldon]Amigo, encontrei outra solucao, pode ser melhor que iterar manualmente a lista inserindo os elementos da outra. Crie uma lista usando new, e adicione os elementos da outra usando a API , metodo addAll. Veja o exemplo:

ArrayList< String > a1 = new ArrayList< String >();
a1.add( “a” );a1.add( “b” );a1.add( “c” );

ArrayList< String > a2 = new ArrayList< String >();
a2.addAll( a1 );

a2.remove( 1 );
System.out.println(a2);
System.out.println(a1);

resultado:
[a, c]
[a, b, c]

Espero ter ajudado, abraco !
[/quote]

Opa, estou com o mesmo problema

Meu ArrayList tem outros ArrayList dentro dele.

sendo assim não consigo copiar os objetos, apenas a referencia deles, ai quando altero, acaba alterando as duas listas, alguem tem uma solução para isso?

O clone do arrayList é shalow (raso) o que significa que ele não clona os objetos dentro do arraylist.
Tem que criar outra lista, iterar cada elemento da original e clonar um a um.


public <T extends Clonable> ArrayList<T> cloneDeep(ArrayList<T> original){

ArrayList<T> result = new ArrayList<T>(original.size());

for (T o:original ){
   result.add((T)o.clone());
}

return result;
}

Se o objeto não for clonável vc precisa de um método que faça a copia e fica assim


public <T> ArrayList<T> cloneDeep(ArrayList<T> original){

ArrayList<T> result = new ArrayList<T>(original.size());

for (T o:original ){
   result.add(copia(o));
}

return result;
}

cuidado com a profundidade da copia do objeto.

[quote=igor.cardoso]Opa, estou com o mesmo problema

Meu ArrayList tem outros ArrayList dentro dele.

sendo assim não consigo copiar os objetos, apenas a referencia deles, ai quando altero, acaba alterando as duas listas, alguem tem uma solução para isso?[/quote]

Se o objeto dentro do arraylist é outro arraylist vc usa o método do post anterior para fazer a copia em vez do método “copia”.

[quote=sergiotaborda][quote=igor.cardoso]Opa, estou com o mesmo problema

Meu ArrayList tem outros ArrayList dentro dele.

sendo assim não consigo copiar os objetos, apenas a referencia deles, ai quando altero, acaba alterando as duas listas, alguem tem uma solução para isso?[/quote]

Se o objeto dentro do arraylist é outro arraylist vc usa o método do post anterior para fazer a copia em vez do método “copia”.[/quote]

meu objeto não tem a opção clone, você pode detalhar melhor o metodo copia(o)?

como faço?

Pelo que eu entendi, vc quer criar um ArrayList usando os elementos de outro já criado, sem referenciar ao mesmo local na memória.
Tente:

ArrayList seuArrayList = new ArrayList(); ArrayList seuNovoArrayList = new ArrayList(seuArrayList);

Fazendo isso ele irá criar um novo arrayList com os mesmos elementos do que vc passou por parâmetro.

Até

[quote=eliangela]Pelo que eu entendi, vc quer criar um ArrayList usando os elementos de outro já criado, sem referenciar ao mesmo local na memória.
Tente:

ArrayList seuArrayList = new ArrayList(); ArrayList seuNovoArrayList = new ArrayList(seuArrayList);

Fazendo isso ele irá criar um novo arrayList com os mesmos elementos do que vc passou por parâmetro.

Até[/quote]

Opa amigão tudo Joia? achei a solução, na verdade consegui implementar o metodo copia informado no post acima.

O metodo ficou da seguinte forma:

[code]public ArrayList<Update> copiarListaScript(ArrayList<Update> listaScript){

	ArrayList&lt;Update&gt; novaListaScript = new ArrayList&lt;Update&gt;();

	for(Update update : listaScript){
		Update novoUpdate = new Update();	
					
		//Principais Dados  do Objeto
		novoUpdate.setId(update.getId());
		novoUpdate.setNome(update.getNome());
		novoUpdate.setDescricao(update.getDescricao());
		novoUpdate.setArea(update.getArea());
		novoUpdate.setTipo(update.getTipo());
		
		//Criando ArrayList
		ArrayList&lt;UpdateParametro&gt; listaParametro = new ArrayList&lt;UpdateParametro&gt;();
		ArrayList&lt;UpdateParametro&gt; listaColuna = new ArrayList&lt;UpdateParametro&gt;();			
		

		//Atribuindo o valor das sub-ArrayLIst
		listaParametro.addAll(update.getListaParametro());
		listaColuna.addAll(update.getListaColuna());			
	
		//Setando novas ArrayLists no novo Objeto
		novoUpdate.setListaParametro(listaParametro);
		novoUpdate.setListaColuna(listaColuna);
		
		//Inserindo Novo Objeto a nova Lista
		novaListaScript.add(novoUpdate);
		
		
	}
	
	return novaListaScript;
}[/code]

Obrigado a todos pela ajuda! :wink: