2011-03-03 11 views
14

Cuando intento de convertir una doble matriz a un arrayList doble Tengo el siguiente error:Convierte una doble matriz para doblar ArrayList

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

A continuación se muestra el código.

double [] firstValueArray ; 

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

estoy comparando esta lista con otra lista y asignar el resultado a otra variable doble.

Háganme saber el motivo de este error.

+5

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

Respuesta

24

Alas, Arrays.asList(..) no funciona con primitivos. Apache commons-lang tiene

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

Muchas gracias Bozho. Solucionó el problema. – gishara

17

Guava 's versión es aún más corto:

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

Referencia:

Nota: Este es un método varargs. Todos los métodos varargs se pueden llamar usando una matriz del mismo tipo (¡pero no del tipo correspondiente en caja/sin caja!). Estas dos llamadas son equivalentes:

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

Además, la versión de guayaba no hacer una travesía completa, es una vista de lista en vivo de la matriz primitiva, la conversión de los primitivos a objetos sólo cuando se accede a ellos.

+0

¿Qué es el método varargs? y cómo las dos llamadas son equivalentes? – JAVA

+0

@sunny el mecanismo se describe aquí: [Java Tutorial: Arbitrary Number of Arguments] (http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs). La frase clave es "Es un atajo para crear una matriz manualmente" –

+0

Parece que la lista devuelta por 'Doubles.asList (double ... backingArray)', no permite ningún cambio, como agregar elementos a la lista usando ' add' o 'addAll'. Enlace actualizado al documento: https://google.github.io/guava/releases/19.0/api/docs/index.html?com/google/common/primitives/Doubles.html –

3

crédito a bestsss por el comentario que debería ser la respuesta:

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

El uso de Java 8 API de Secuencia esto se consigue con

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

Si devolver un ArrayList como una implementación se requiere a continuación, utilizar

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

Este one-liner no requiere ninguna bibliotecas dditional.

Cuestiones relacionadas