Problemas para clonar Coleção

8 respostas
P

Opa :smiley:

Preciso clonar uma coleção para poder trabalhar com ela e remover itens de uma das listas sem prejudicar a outra e to tentando clonar a coleção da seguinte maneira:

private HSSFWorkbook gerarRelatorio(List relatorio) {
		List listaDoidia = new ArrayList();
		Collections.copy(listaDoidia, relatorio);
// resto da implementação
}

O que estou fazendo de errado?

Obg

8 Respostas

T

Collections.copy é mais ou menos como se fosse um daqueles loops que copiam arrays, e implementado mais ou menos como se fosse isso. Portanto, ele não “aumenta” o tamanho da Collection destino.

No seu caso em particular, você pode fazer:

List listaDoidia = new ArrayList(relatorio);

Veja sempre a documentação. http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html

T

Você já ouviu falar em “shallow copy” (cópia rasa) e “deep copy” (cópia profunda)? O que mostrei faz uma “shallow copy”, ou seja, copia apenas as referências aos objetos contidos na coleção “relatorio”. Ele não clona os objetos em si. Se precisar de uma “deep copy” aí é por sua conta (um dos problemas de uma “deep copy” é que pode ser que os objetos contidos na coleção “relatorio” podem não ser todos clonáveis :frowning:

P

Entendi, eu precisava mesmo clonar pq a listaDoidia seria pra comparar os registros que pertencem a um mesmo objeto pra poder montar no POI e o que fosse igual, eu já iria removendo da outra lista.

Este List listaDoidia = new ArrayList(relatorio);, não funcionou pq ele criou a listaDoidia de maneira vazia e o relatorio, está totalmente preenchido.

Tem algo que eu esteja fazendo de errado?

ps.: to usando java 1.4

Obrigado

P

thingol:
Você já ouviu falar em “shallow copy” (cópia rasa) e “deep copy” (cópia profunda)? O que mostrei faz uma “shallow copy”, ou seja, copia apenas as referências aos objetos contidos na coleção “relatorio”. Ele não clona os objetos em si. Se precisar de uma “deep copy” aí é por sua conta (um dos problemas de uma “deep copy” é que pode ser que os objetos contidos na coleção “relatorio” podem não ser todos clonáveis :frowning:

Entendi, mas se eu fizer uma cópia rasa e deletar um objeto da coleção “relatorio”, ele será removida também da coleção “listaDoidia”?

Obnrigado

P

Consegui clonar…eu estava fazendo errado pq eu tinha removido o Collections.copy() :oops:

Valeu pelas dicas sobre os tipos de cópia

Obrigado

T

Não. Vamos dar um exemplo mais simples.

Digamos que você tenha dois arraylists, “relatorio” e “listadodia”.

List<String> relatorio = new ArrayList<String>();
relatorio.add ("josé");
relatorio.add ("joão");
System.out.println (relatorio); // imprime [josé, joão]

// A linha a seguir copia as referências aos objetos contidos em "relatorio"
// para a lista "listadodia". Depois disso, irá haver 2 referências para cada objeto
// (uma na lista "relatorio", outra na lista "listadodia")
List<String> listadodia = new ArrayList<String>(relatorio);
System.out.println (listadodia); // imprime [josé, joão]
// A linha a seguir irá remover 1 referência ao objeto "josé" da lista "relatorio" e deixar
//  com a referência na lista "listadodia".
relatorio.remove ("josé"); // removendo o josé do relatório original
System.out.println (relatorio); // imprime [joão]
// Veja que a "listadodia" conserva-se inalterada
System.out.println (listadodia); // imprime [josé, joão]
Vini_Fernandes

Cara, eu já precisei de algo semelhante e uma solucao que adotei foi clonar os objetos que eu tinha de uma lista antiga e adicionar os objetos clonados em uma nova lista. Imagine agora que tenhamos uma classe carro e uma lista de carros que queremos copiar, sendo assim:

class Carro{
 public String placa;
 public String chassis;

 public Carro(String p, string c){
    placa = p;
    chassis = c;
 }
 public Carro clone(Carro c){
  Carro novo = new Carro();
   novo.placa  = c.placa;
   novo.chassis = c.chassis;
   return novo;
 }

  
}

public class Teste{

    public static List<Carro> copiarListaDeCarros(List<Carro> lista){
       List<Carro> nova = new ArrayList<Carro>();
       for(Carro c : lista)  {
          nova.add(c.clone());
        }
      return nova;
    }


    public static void main(String ... asdf){
     
    List<Carro> lista = new ArrayList<Carro>();
     lista.add(new Carro("ASD-1234", "44444"));
     lista.add(new Carro("XXX-1111", "111111"));
     lista.add(new Carro("KKK-3333", "3333"));
 
    List<Carro> novaLista = copiarListaDeCarros(lista);


  }

}

Abracao

P

thingol

Neste exemplo ficou tudo bem claro, consegui entender o que ocorre

Obrigado!

Criado 6 de fevereiro de 2009
Ultima resposta 6 de fev. de 2009
Respostas 8
Participantes 3