Mam tablicę, która została zainicjowana jak:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Chciałbym przekonwertować tę tablicę na obiekt ArrayList
klasy.
ArrayList<Element> arraylist = ???;
java
arrays
arraylist
type-conversion
Ron Tuffin
źródło
źródło
ArrayList
. Plakat poprosił o to specjalnie.Odpowiedzi:
źródło
new ArrayList
połączenie również jest niepotrzebne.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
bez przekazania go do nowegoArrayList
obiektu poprawi rozmiar listy. Jednym z najczęstszych powodów używania anArrayList
jest możliwość dynamicznej zmiany jej rozmiaru, a twoja sugestia by temu zapobiec.Dany:
Najprostsza odpowiedź to:
To zadziała dobrze. Ale niektóre zastrzeżenia:
ArrayList
. W przeciwnym razie dostanieszUnsupportedOperationException
.asList()
jest z oryginalnej tablicy. Jeśli zmodyfikujesz oryginalną tablicę, lista również zostanie zmodyfikowana. To może być zaskakujące.źródło
java.util.ArrayList
. Arrays.asList faktycznie zwraca a,java.util.Arrays.ArrayList
która nie jestinstanceof
inną klasą. Trzecim zastrzeżeniem jest to, że jeśli spróbujesz użyć go w kontekście wymagającym powyższego, nie zadziała.(stary wątek, ale tylko 2 centy, ponieważ nikt nie wspomina o Guava ani innych bibliotekach i niektórych innych szczegółach)
Jeśli możesz, użyj Guawy
Warto wskazać drogę Guava, która znacznie upraszcza te shenanigany:
Stosowanie
Dla niezmiennej listy
Użyj
ImmutableList
klasy i jegoof()
andcopyOf()
fabryka metod (elementy nie mogą być puste) :Dla Zmiennej Listy
Użyj
Lists
klasy i jejnewArrayList()
metod fabrycznych:Należy również zwrócić uwagę na podobne metody dla innych struktur danych w innych klasach, na przykład w
Sets
.Dlaczego Guawa?
Główną atrakcją może być zmniejszenie bałaganu ze względu na generyczne czynniki bezpieczeństwa typu, ponieważ zastosowanie fabrycznych metod Guava pozwala na wywnioskowanie typów przez większość czasu. Jednak ten argument zawiera mniej wody, odkąd Java 7 pojawiła się z nowym operatorem diamentów.
Ale to nie jedyny powód (a Java 7 nie jest jeszcze wszędzie): składnia skrócona jest również bardzo przydatna, a inicjalizatory metod, jak pokazano powyżej, pozwalają pisać bardziej ekspresyjny kod. Robisz w jednym wywołaniu Guava, co zajmuje 2 z bieżącymi kolekcjami Java.
Jeśli nie możesz ...
Dla niezmiennej listy
Użyj
Arrays
klasy JDK i jejasList()
metody fabrycznej, opakowanej wCollections.unmodifiableList()
:Należy pamiętać, że zwracany typ na
asList()
toList
stosując konkretnąArrayList
realizację, ale to nie jestjava.util.ArrayList
. Jest to typ wewnętrzny, który emuluje,ArrayList
ale faktycznie bezpośrednio odwołuje się do przekazanej tablicy i sprawia, że „zapisuje” (modyfikacje są odzwierciedlane w tablicy).Zabrania modyfikacji niektórych
List
metod interfejsu API poprzez proste rozszerzenieAbstractList
(więc dodawanie lub usuwanie elementów nie jest obsługiwane), jednak umożliwia wywołanieset()
elementów zastępujących. Tak więc ta lista nie jest naprawdę niezmienne i wywołanieasList()
powinno być owinięteCollections.unmodifiableList()
.Zobacz następny krok, jeśli potrzebujesz listy zmiennych.
Dla listy zmiennych
Taki sam jak powyżej, ale owinięty rzeczywistym
java.util.ArrayList
:Do celów edukacyjnych: The Good ol 'Manual Way
źródło
List
zwracane przezArrays.asList
jest zmienne, ponieważ nadal możesz zmieniaćset
elementy - po prostu nie można go zmieniać . W przypadku niezmiennych list bez Guava możesz wspomniećCollections.unmodifiableList
.arrayToList
dla Java 1.5+ jest niepoprawny. Jesteś instanciating listString
, i stara się odzyskać sznurki z danej tablicy, zamiast używania ogólny typ parametruT
. Poza tym dobra odpowiedź i +1 za bycie jedynym, w tym sposób ręczny.O(1)
, ale dla niezmienności musisz wykonać kopię, npCollections.unmodifiableList(new ArrayList<>(Arrays.asList(array)))
. Przez .Ponieważ to pytanie jest dość stare, zaskakuje mnie to, że nikt jeszcze nie zaproponował najprostszej formy:
Począwszy od Java 5,
Arrays.asList()
pobiera parametr varargs i nie musisz jawnie konstruować tablicy.źródło
List<String> a = Arrays.asList("first","second","third")
Upewnij się, że
myArray
jest tego samego typu coT
. Otrzymasz błąd kompilatora, jeśli spróbujesz utworzyć naList<Integer>
przykład tablicęint
.źródło
Inny sposób (choć zasadniczo równoważny pod względem
new ArrayList(Arrays.asList(array))
wydajności rozwiązania:źródło
Java 9
W Javie 9 możesz użyć
List.of
statycznej metody fabrycznej, aby utworzyćList
literał. Coś w stylu:To zwróci niezmienną listę zawierającą trzy elementy. Jeśli chcesz listę zmienną , przekaż tę listę do
ArrayList
konstruktora:JEP 269: Wygodne metody fabryczne dla kolekcji
JEP 269 zapewnia kilka fabrycznych metod dla interfejsu API Java Collections . Te niezmienne statyczne metody fabryczne są wbudowane w
List
,Set
iMap
interfejsów w Javie 9 i nowszych.źródło
Prawdopodobnie potrzebujesz tylko listy, a nie ArrayList. W takim przypadku możesz po prostu:
źródło
set
metodę), nie możesz zmienić rozmiaru listy (nieadd
lubremove
elementów)!Kolejna aktualizacja, prawie kończąca się w 2014 roku, możesz zrobić to również z Javą 8:
Uratowałoby się kilka znaków, gdyby to mogła być tylko
List
źródło
Collectors.toList()
rzeczywistości zwraca wartośćArrayList
.Jeśli użyjesz :
Państwo może tworzyć i wypełnić dwie listy! Wypełnianie dwukrotnie dużej listy jest dokładnie tym, czego nie chcesz robić, ponieważ utworzy ona kolejną
Object[]
tablicę za każdym razem, gdy pojemność musi zostać zwiększona.Na szczęście implementacja JDK jest szybka i
Arrays.asList(a[])
bardzo dobrze wykonana. Tworzy rodzaj ArrayList o nazwie Arrays.ArrayList, w którym dane Object [] wskazują bezpośrednio na tablicę.Niebezpieczną stroną jest to, że jeśli zmienisz początkową tablicę, zmienisz listę! Czy na pewno tego chcesz? Może tak, może nie.
Jeśli nie, najbardziej zrozumiałym sposobem jest zrobienie tego:
Lub, jak powiedział @glglgl, możesz utworzyć inną niezależną ArrayList za pomocą:
Uwielbiam używać
Collections
,Arrays
lub guawy. Ale jeśli to nie pasuje lub nie czujesz tego, po prostu napisz inną nieelegacyjną linię.źródło
new ArrayList<T>(Arrays.asList(myArray));
częścią, której odradzasz używać. Oba robią to samo i mają tę samą złożoność.new ArrayList<T>(Arrays.asList(myArray));
robi to samo, kopiujeasList
doArrayList
...W
Java 9
możesz użyć:źródło
Zgodnie z pytaniem odpowiedź przy użyciu java 1.7 brzmi:
Lepiej jednak zawsze używać interfejsu:
źródło
źródło
Możesz dokonać konwersji przy użyciu różnych metod
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Więcej informacji można znaleźć na stronie http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
źródło
jak wszyscy powiedzieli, to zrobi
a powszechnym najnowszym sposobem tworzenia tablicy jest tablice obserwowalne
ObservableList: Lista, która pozwala słuchaczom na śledzenie zmian w momencie ich wystąpienia.
dla Java SE możesz spróbować
to jest zgodne z Oracle Docs
Zaktualizuj Javę 9
także w Javie 9 jest to trochę łatwe:
źródło
Od wersji Java 8 istnieje łatwiejszy sposób na transformację:
źródło
Możesz to również zrobić ze strumieniem w Javie 8.
źródło
Collectors.toList()
zwróci anArrayList
. Może to jednak różnić się w przyszłych wersjach java.Jeśli chcesz określonego typu kolekcji, użyjCollectors.toCollection()
zamiast tego, gdzie możesz określić, jaki dokładnie typ kolekcji chcesz utworzyć.Jeśli zobaczymy definicję
Arrays.asList()
metody, otrzymasz coś takiego:Więc możesz zainicjować w
arraylist
ten sposób:Może być też inna odpowiedź na to pytanie.
Jeśli zobaczysz deklarację
java.util.Collections.addAll()
metody, otrzymasz coś takiego:Tak więc ten kod jest również przydatny do tego
źródło
Innym prostym sposobem jest dodanie wszystkich elementów z tablicy do nowej ArrayList za pomocą pętli dla każdego z nich.
źródło
Jeśli tablica jest typu pierwotnego, podane odpowiedzi nie będą działać. Ale od wersji Java 8 możesz używać:
źródło
char
tablicą.Możesz to zrobić w Javie 8 w następujący sposób
źródło
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Możemy łatwo przekonwertować tablicę na
ArrayList
. UżywamyaddAll()
metody interfejsu Collection w celu kopiowania treści z jednej listy na drugą.źródło
ArrayList
konstruktorów przyjmuje? extends Collection<T>
argument, powodując wywołanieaddAll
nadmiaru.Mimo że istnieje wiele doskonale napisanych odpowiedzi na to pytanie, dodam swoje uwagi.
Powiedz, że masz
Element[] array = { new Element(1), new Element(2), new Element(3) };
Nową ArrayList można utworzyć na następujące sposoby
I bardzo dobrze obsługują wszystkie operacje ArrayList
Ale następujące operacje zwracają tylko widok listy ArrayList, a nie rzeczywistą ArrayList.
Dlatego dadzą błąd podczas próby wykonania niektórych operacji ArrayList
Więcej na temat reprezentacji listy linku do tablicy .
źródło
Najprostszym sposobem na to jest dodanie następującego kodu. Wypróbowany i przetestowany.
źródło
Wyjście to ...
Witaj
świecie
źródło
Użyj poniższego kodu, aby przekonwertować tablicę elementów na ArrayList.
źródło
Już wszyscy udzielili wystarczająco dobrej odpowiedzi na problem. Teraz na podstawie wszystkich sugestii musisz zdecydować, który będzie pasował do twoich wymagań. Istnieją dwa rodzaje kolekcji, które musisz znać. Jedna to niezmodyfikowana kolekcja, a druga kolekcja, która pozwoli ci później zmodyfikować obiekt.
Podam więc krótki przykład dwóch przypadków użycia.
Niezmienne tworzenie kolekcji :: Gdy nie chcesz modyfikować obiektu kolekcji po utworzeniu
List<Element> elementList = Arrays.asList(array)
Zmienne tworzenie kolekcji :: Kiedy możesz zmodyfikować utworzony obiekt kolekcji po utworzeniu.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
źródło
List
zwracana przezArrays.asList
jest tylko opakowaniem oryginalnej tablicy i pozwala na dostęp i modyfikację poszczególnych elementów za pomocąget
iset
. Prawdopodobnie powinieneś wyjaśnić, że masz na myśli „nie dodawaj ani nie usuwaj elementów” zamiast „niezmienny”, co oznacza, że wcale się nie zmieniasz.Dana tablica obiektów:
Konwertuj tablicę na listę:
Konwertuj tablicę na ArrayList
Konwertuj tablicę na LinkedList
Drukuj listę:
WYNIK
1
2)
3)
źródło
Klasa Arrays w Javie 8 zapewnia metodę stream (), która ma przeciążone wersje akceptujące zarówno prymitywne tablice, jak i tablice Object.
źródło
Poniższy kod wydaje się dobrym sposobem na zrobienie tego.
źródło