Jak przekonwertować tablicę na listę w Javie?
Użyłem, Arrays.asList()
ale zachowanie (i podpis) jakoś zmieniło się z Java SE 1.4.2 (dokumenty są teraz w archiwum) na 8, a większość fragmentów znalezionych w Internecie używa zachowania 1.4.2.
Na przykład:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- na 1.4.2 zwraca listę zawierającą elementy 1, 2, 3
- w wersji 1.5.0+ zwraca listę zawierającą spam spamowy
W wielu przypadkach powinno być łatwe do wykrycia, ale czasami może się niepostrzeżenie wymknąć:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java
arrays
list
data-conversion
Alexandru
źródło
źródło
Arrays.asList(new int[] { 1, 2, 3 })
:; zdecydowanie nie skompilować w Java 1.4.2, ponieważint[]
jest nieObject[]
.Arrays.asList
powinien działać.Odpowiedzi:
W twoim przykładzie dzieje się tak, ponieważ nie możesz mieć listy typu pierwotnego. Innymi słowy,
List<int>
nie jest to możliwe.Możesz jednak
List<Integer>
użyćInteger
klasy, która otaczaint
prymityw. Konwersja tablicy doList
zeArrays.asList
sposobem gospodarczym.Zobacz ten kod uruchamiany na żywo w IdeOne.com .
źródło
List<Integer[]>
?Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
W Javie 8 możesz używać strumieni:
źródło
boolean[]
. Myślę, że to dlatego, że tak samo łatwo jest zrobićBoolean[]
. To prawdopodobnie lepsze rozwiązanie. W każdym razie to ciekawe dziwactwo.Mówiąc o sposobie konwersji, zależy to od tego, dlaczego potrzebujesz swojego
List
. Jeśli potrzebujesz tylko do odczytu danych. Ok, no to dajesz:Ale jeśli zrobisz coś takiego:
dostajesz
java.lang.UnsupportedOperationException
. Więc w niektórych przypadkach potrzebujesz tego:Pierwsze podejście faktycznie nie konwertuje tablicy, ale „reprezentuje” ją jak
List
. Ale tablica jest pod maską i ma wszystkie swoje właściwości, takie jak stała liczba elementów. Pamiętaj, że musisz podać typ podczas konstruowaniaArrayList
.źródło
Problem polega na tym, że varargs został wprowadzony w Javie 5 i niestety
Arrays.asList()
został również przeciążony wersją vararg. TakArrays.asList(spam)
jest rozumiany przez kompilator Java5 jako parametr vararg tablic int.Problem ten wyjaśniono bardziej szczegółowo w Effective Java 2nd Ed., Rozdział 7, pozycja 42.
źródło
Wydaje się, że trochę późno, ale oto moje dwa centy. Nie możemy mieć
List<int>
zaint
to prymitywny typ tak możemy mieć tylkoList<Integer>
.Java 8 (tablica int)
Java 8 i niższe (tablica liczb całkowitych)
Potrzebujesz ArrayList, a nie List?
Jeśli chcemy konkretnej implementacji
List
np.ArrayList
Możemy użyćtoCollection
jako:Dlaczego
list21
nie można modyfikować strukturalnie?Kiedy używamy,
Arrays.asList
rozmiar zwracanej listy jest ustalony, ponieważ zwracana lista nie jestjava.util.ArrayList
, ale prywatną klasą statyczną zdefiniowaną w środkujava.util.Arrays
. Więc jeśli dodamy lub usuniemy elementy ze zwróconej listy,UnsupportedOperationException
zostanie wygenerowany znak „ an” . Więc powinniśmy iść,list22
kiedy chcemy zmodyfikować listę. Jeśli mamy Javę 8, możemy również skorzystać zlist23
.Dla jasności
list21
można zmodyfikować w tym sensie, że możemy wywoływać,list21.set(index,element)
ale ta lista może nie być modyfikowana strukturalnie, tj. Nie może dodawać ani usuwać elementów z listy. Możesz również sprawdzić to pytanie .Jeśli chcemy niezmienną listę, możemy ją zawinąć jako:
Inną kwestią do odnotowania jest to, że metoda
Collections.unmodifiableList
zwraca niemodyfikowalny widok podanej listy. Kolekcja niemodyfikowalna jest kolekcją niemodyfikowalną, a także widokiem na kolekcję podkładową. Należy pamiętać, że zmiany w kolekcji kopii zapasowych mogą być nadal możliwe, a jeśli wystąpią, są widoczne w widoku niemodyfikowalnym.Możemy mieć naprawdę niezmienną listę w Javie 9 i 10.
Naprawdę niezmienna lista
Java 9:
Java 10 (lista prawdziwie niezmienna) na dwa sposoby:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Sprawdź również moją odpowiedź, aby uzyskać więcej.
źródło
List::add
iList::remove
niepowodzenie z listą zwróconą przezArrays.asList
. JavaDoc dla tej metody jest źle napisany i niejasny w tej kwestii. W trzecim czytaniu przypuszczam, że wyrażenie „o stałym rozmiarze” miało oznaczać, że nie można dodawać ani usuwać elementów.Jeszcze krótszy:
źródło
Niedawno musiałem przekonwertować tablicę na listę. Później program przefiltrował listę próbując usunąć dane. Korzystając z funkcji Arrays.asList (tablica), tworzysz kolekcję o stałym rozmiarze: nie możesz ani dodawać, ani usuwać. Ten wpis wyjaśnia problem lepiej niż potrafię: Dlaczego otrzymuję UnsupportedOperationException podczas próby usunięcia elementu z listy? .
W końcu musiałem wykonać konwersję „ręczną”:
Przypuszczam, że mogłem dodać konwersję z tablicy do listy za pomocą operacji List.addAll (items).
źródło
new ArrayList<ListItem>(Arrays.asList(itemsArray))
zrobiłby to samoCollections.addAll(items, itemsArray)
zamiast tego.Korzystanie z tablic
Jest to najprostszy sposób na konwersję tablicy
List
. Jeśli jednak spróbujesz dodać nowy element lub usunąć istniejący element z listy,UnsupportedOperationException
zostanie wyrzucony.Korzystanie z ArrayList lub innych implementacji listy
for
Pętli można użyć do dodania wszystkich elementów tablicy doList
implementacji, np .ArrayList
:Korzystanie ze Stream API w Javie 8
Możesz przekształcić tablicę w strumień, a następnie zebrać strumień przy użyciu różnych kolektorów: Domyślny kolektor w Javie 8 jest używany
ArrayList
za ekranem, ale możesz także narzucić preferowaną implementację.Zobacz też:
źródło
Kolejne obejście, jeśli używasz apache commons-lang:
Gdzie ArrayUtils.toObject konwertuje
int[]
naInteger[]
źródło
musisz rzucić się na tablicę
źródło
Jednowarstwowy:
źródło
W Javie 9 masz jeszcze bardziej eleganckie rozwiązanie polegające na użyciu niezmiennych list za pomocą nowej metody fabryki wygody
List.of
:(bezwstydnie skopiowane stąd )
źródło
Jeśli celujesz w Javę 8 (lub nowszą wersję), możesz spróbować:
UWAGA:
Zwróć uwagę na
Collectors.<Integer>toList()
tę ogólną metodę, która pozwala uniknąć błędu „Niezgodność typu: nie można przekonwertować zList<Object>
naList<Integer>
”.źródło
Używanie Guawy:
Korzystanie z kolekcji Apache Commons:
źródło
Jeśli to pomaga: miałem ten sam problem i po prostu napisałem ogólną funkcję, która pobiera tablicę i zwraca ArrayList tego samego typu o tej samej treści:
źródło
Biorąc pod uwagę tablicę:
Konwertowanie tablicy liczb całkowitych na listę liczb całkowitych
Jeden sposób: boxed () -> zwraca IntStream
Drugi sposób: zamapuj każdy element strumienia na liczbę całkowitą, a następnie zbierz
UWAGA: Korzystając z mapToObj, możesz ukryć każdy element int w strumieniu łańcucha, strumieniu znaków itp., Umieszczając i do (char) i
Konwertowanie jednego typu tablicy na inny typ Przykład:
źródło
To zależy od tego, którą wersję Java próbujesz-
Java 7
LUB
LUB
W Javie 8
Odniesienia - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
źródło
Czy możesz poprawić tę odpowiedź, ponieważ tego używam, ale nie jestem w 100% jasny. Działa dobrze, ale IntelliJ dodał nową WeatherStation [0]. Dlaczego 0?
źródło
użyj dwóch linii kodu, aby przekonwertować tablicę na listę, jeśli użyjesz go w wartości całkowitej, musisz użyć typu autoboxing dla pierwotnego typu danych
źródło