2011-03-03 1 views
14

Quando provo a convertire un doppio array ad un doppio arrayList ho ottenuto il seguente errore:Convertire un doppio array per raddoppiare ArrayList

Exception in thread "main" java.lang.ClassCastException: [D cannot be cast to java.lang.Double

Di seguito è riportato il mio codice.

double [] firstValueArray ; 

ArrayList <Double> firstValueList = new ArrayList (Arrays.asList(firstValueArray));

mi sto paragonando questa lista con un altro elenco e assegnare il risultato ad un altro doppio variabile.

Per favore fatemi sapere il motivo di questo errore.

+5

'for (doule d: doubleArray) arrayList.add (d);' – bestsss

risposta

24

Ahimè, Arrays.asList(..) non funziona con le primitive. Apache commons-lang ha

Double[] doubleArray = ArrayUtils.toObject(durationValueArray); 
List<Double> list = Arrays.asList(doubleArray); 
+0

Grazie mille Bozho. Ha risolto il problema. – gishara

17

s' Guava versione è ancora più breve:

List<Double> list = Doubles.asList(doubleArray); 

Riferimento:

Nota: Questo è un metodo varargs. Tutti i metodi vararg possono essere chiamati usando un array dello stesso tipo (ma non del tipo boxed/unboxed corrispondente !!). Queste due chiamate sono equivalenti:

Doubles.asList(new double[]{1d,2d}); 
Doubles.asList(1d,2d); 

Inoltre, la versione Guava non fa una traversata completa, si tratta di una visualizzazione elenco vivo della matrice primitiva, la conversione di primitive per oggetti solo quando vi si accede.

+0

Che cos'è il metodo varargs? e in che modo le due chiamate sono equivalenti? – JAVA

+0

@sunny il meccanismo è descritto qui: [Java Tutorial: Arbitrary Number of Arguments] (http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs). La frase chiave è "È una scorciatoia per creare manualmente un array" –

+0

Sembra che la lista restituita da 'Doubles.asList (double ... backingArray)', non consenta alcuna modifica, come aggiungere elementi all'elenco usando ' add' o 'addAll'. Link aggiornato al documento: https://google.github.io/guava/releases/19.0/api/docs/index.html?com/google/common/primitives/Doubles.html –

3

credito al bestsss per il commento, che dovrebbe essere la risposta:

ArrayList<Double> firstValueList = new ArrayList<Double>(); 
for(double d : firstValueArray) firstValueList.add(d); 
12

utilizzando Java 8 Streams API questo si ottiene con

DoubleStream.of(doublesArray).boxed().collect(Collectors.toList()); 

se restituendo un ArrayList come un'implementazione è necessario quindi utilizzare

DoubleStream.of(doublesArray).boxed().collect(Collectors.toCollection(ArrayList::new)); 

Questo one-liner non richiede alcun librerie aggiuntive.