2012-05-03 15 views
10

Vale a dire, senza fare riferimento allo stesso oggetto, ho bisogno di copiare i valori degli elementi di una lista in un'altra lista. Questi sono gli elenchi:Come copiare valori, non riferimenti, di Elenco <Integer> in un altro elenco?

List<Integer> listA = new ArrayList<Integer>(); 
List<Integer> ListB = new ArrayList<Integer>(); 

listA = (added some values); 

listB = (do what?)... 

PS. Mi chiedo per la domanda del principiante, ma non ho mai fatto una cosa del genere.

+0

Vuoi dire che devi copiare gli oggetti sulla stessa lista? Copia profonda? Sou hai oggetti identici negli elenchi ma non lo stesso riferimento? – pfh

+0

@pfh Per copiare valori interi da una lista a un'altra. Non riferimenti – sandalone

+1

Usando la classe Integer userete oggetti (riferimenti), non valori (primitive). Sotto, dai un'occhiata, potresti trovarti nei problemi quando "copi" gli oggetti. Integer e le altre classi "in box" sono immutabili, ma in realtà è un int in scatola a cui fa riferimento List. – pfh

risposta

12

Si può cercare di dare uno sguardo al metodo di Collections.copy:

pubblico copia static void (Elenco dest, Elenco src)

Copia tutti gli elementi da una lista all'altra. Dopo l'operazione, l'indice di ciascun elemento copiato nell'elenco di destinazione sarà identico al suo indice nell'elenco di origini . L'elenco delle destinazioni deve essere lungo almeno quanto l'elenco delle origini . Se è più lungo, gli elementi rimanenti nell'elenco delle destinazioni non sono interessati. Questo metodo viene eseguito in tempo lineare.

Parametri: dest - L'elenco delle destinazioni. src - L'elenco delle fonti.

Nota: È possibile che questo dovrebbe funzionare per semplici tipi di dati quali numeri interi, tuttavia, se avete i propri oggetti, che potrebbe a sua volta riferimento altri oggetti, si dovrà iterare su ogni oggetto e copiarlo separatamente.

+0

Sembra fantastico. Il descr non dice se questo copia valori o riferimenti? – sandalone

+0

@sandalone: ​​per quanto ne so, questo dovrebbe eseguire una copia superficiale, il che significa che gli interi saranno copiati. Tuttavia, come affermato nella mia risposta, oggetti più complessi richiederanno di iterare su di loro e copiarli uno per uno. – npinti

+0

Questo non è un riferimento, sarà copie degli oggetti dal secondo ArrayList. – kapand

0

Prova questo.

ListB.addAll(listA); 
+4

Questo non creerà copie degli oggetti - copierà riferimenti. –

+0

@ BjörnPollex: Penso che la domanda sia ambigua. IMO l'OP sta parlando del riferimento * alla lista *, non dei riferimenti agli * elementi della lista *. Ho letto la domanda per la prima volta, ma ora mi sto appoggiando all'altra interpretazione. – NPE

4

Utilizzare questo method di Collections classe per copiare tutti gli elementi di ArrayList ad un altro ArrayList:

Collections.copy(listA, listB); 
2

Prova a usare questo, mentre le risposte fornite da altri ragazzi sono assolutamente soddisfacenti. Ma secondo la mia opzione, il seguente sarebbe il modo migliore:

List<Integer> listB = new ArrayList<Integer>(listA); 
+2

non farà riferimento solo a questa copia? – sandalone

+0

This, Collections.copy() - copierà i riferimenti. Dipende ciò di cui hai veramente bisogno. – pfh

+0

Questo copierà l'elemento come riferimento. – Vargan

14

Non c'è assolutamente alcun motivo per fare una copia di un intero. L'intero è una classe immutabile. Ciò significa che il suo valore viene impostato quando viene creata l'istanza Integer e non può mai essere modificata. Un riferimento Integer può quindi essere condiviso da più elenchi e thread senza paura, perché non c'è modo che qualcuno possa cambiarne il valore. La tua domanda non ha quindi alcun senso.

Per creare un ArrayList b contenente gli stessi numeri interi come un altro elenco a, basta utilizzare il seguente codice:

List<Integer> b = new ArrayList<Integer>(a); 

Certo l'intero non sarà clonato, ma questa è una buona cosa, perché li clonazione è completamente inutile.

+1

In questo modo, cancellando una lista b si cancellerà anche l'elenco a, giusto? Voglio evitare che questo elenco di una di queste liste sia un elenco di backup. – sandalone

+1

Perché dovrebbe? Hai due istanze di lista. Quello che fai con uno non influenza l'altro. La javadoc per questo costruttore dice: * Costruisce una lista contenente gli elementi della collezione specificata, nell'ordine in cui vengono restituiti dall'iteratore della collezione. * –

+1

Non so perché questa non è la risposta –

1

ListB.addAll(ListA);

L'intero classe è immutabile, quindi dopo che il valore iniziale di un oggetto intero è stato impostato, non può essere modificato.Questa domanda non ha molto senso perché non devi preoccuparti che il contenuto di listB venga modificato da metodi che agiscono sul contenuto di ListA, perché gli oggetti Integer sono immutabili.

+0

Questo aggiunge riferimenti e non valori. http://stackoverflow.com/a/7924911/4462906 – Roon13

Problemi correlati