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 … 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.
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:
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 ?
[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.
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]
: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:
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;
}
[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)?
[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.
ArrayList<Update> novaListaScript = new ArrayList<Update>();
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<UpdateParametro> listaParametro = new ArrayList<UpdateParametro>();
ArrayList<UpdateParametro> listaColuna = new ArrayList<UpdateParametro>();
//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]