2011-03-03 9 views
14

Kiedy próbuję przekonwertować podwójne tablicy do podwójnego ArrayList mam następujący błąd:Konwersja podwójna tablica na Double ArrayList

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

Poniżej jest mój kod.

double [] firstValueArray ; 

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

jestem porównanie tej listy z innej listy i przypisać wynik do innej zmiennej podwójnym.

Proszę dać mi znać przyczynę tego błędu.

+5

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

Odpowiedz

24

Niestety, Arrays.asList(..) nie działa z prymitywami. Apache commons-lang ma

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

Wielkie dzięki Bozho. Rozwiązał problem. – gishara

17

Guava „s wersja jest jeszcze krótszy:

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

referencyjny:

Uwaga: To jest metoda varargs. Wszystkie metody varargs można wywołać za pomocą tablicy tego samego typu (ale nie z odpowiedniego typu boxed/unboxed !!). Te dwa połączenia są równoważne:

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

Również wersja Guava nie zrobić pełny trawers, to live view Lista pierwotnej tablicy konwersji prymitywów do obiektów tylko wtedy, gdy będą one dostępne.

+0

Co to jest metoda varargs? i jak te dwa połączenia są równoważne? – JAVA

+0

@unny mechanizm jest opisany tutaj: [Samouczek w Javie: dowolna liczba argumentów] (http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs). Kluczową frazą jest "Jest to skrót do ręcznego tworzenia tablicy" –

+0

Wygląda na to, że lista zwrócona przez 'Doubles.asList (double ... backingArray)', nie zezwala na żadne zmiany, takie jak dodanie elementów do listy przy użyciu ' add' lub 'addAll'. Zaktualizowany link do dokumentu: https://google.github.io/guava/releases/19.0/api/docs/index.html?com/google/common/primitives/Doubles.html –

3

zgłosił bestsss za komentarz, który powinien być odpowiedź:

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

Korzystanie Java 8 Streams API ten został osiągnięty dzięki

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

Jeśli zwrócenie ArrayList jako wdrożenie jest wymagane następnie użyj

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

Ten jednolinijkowy nie wymaga żadnego dodatkowe biblioteki.