Konvertieren eines Arrays in eine Liste in Java


1028

Wie konvertiere ich ein Array in eine Liste in Java?

Ich habe das verwendet, Arrays.asList()aber das Verhalten (und die Signatur) haben sich irgendwie von Java SE 1.4.2 (Dokumente jetzt im Archiv) auf 8 geändert , und die meisten Snippets, die ich im Web gefunden habe, verwenden das Verhalten 1.4.2.

Zum Beispiel:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • on 1.4.2 gibt eine Liste mit den Elementen 1, 2, 3 zurück
  • on 1.5.0+ gibt eine Liste mit dem Array-Spam zurück

In vielen Fällen sollte es leicht zu erkennen sein, aber manchmal kann es unbemerkt verrutschen:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

20
Ich denke, dein Beispiel ist gebrochen : Arrays.asList(new int[] { 1, 2, 3 }); auf jeden Fall hat kompilieren nicht in Java 1.4.2, weil ein int[]ist nicht ein Object[].
Joachim Sauer

1
Oh, vielleicht hast du recht. Ich hatte keinen Java 1.4.2-Compiler, um mein Beispiel vor dem Posten zu testen. Jetzt, nach Ihrem Kommentar und Joes Antwort, macht alles viel mehr Sinn.
Alexandru

1
Ich dachte, Autoboxing hätte die Konvertierung von der primitiven in die Wrapper-Integer-Klasse abgedeckt. Sie können die Besetzung zuerst selbst vornehmen und dann sollte der obige Code für Arrays.asListfunktionieren.
Pferdestimme

2
Stream.boxed () von Java 8 kümmert sich um das Autoboxing und kann dafür verwendet werden. Siehe meine Antwort unten .
Ibrahim Arief

Antworten:


1431

In Ihrem Beispiel liegt dies daran, dass Sie keine Liste eines primitiven Typs haben können. Mit anderen Worten List<int>ist nicht möglich.

Sie können haben jedoch eine List<Integer>die Verwendung von IntegerKlasse, die die Packungen intprimitiv. Konvertieren Sie Ihr Array Listmit der Arrays.asListUtility-Methode in a.

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

Sehen Sie diesen Code live auf IdeOne.com .


112
Oder noch einfacher: Arrays.asList (1, 2, 3);
Kong

45
Woher weiß es, keine zu erstellen List<Integer[]>?
Thomas Ahle

25
Schlägt in Java 5+ fehl.
Djechlin

6
@ThomasAhle Es wird kein List <Integer []> erstellt, sondern ein List <Integer> -Objekt. Und wenn Sie typsicher sein möchten, schreiben Sie: Arrays. <Integer> asList (Spam);
user1712376

6
@ ThomasAhle Das ist eine gute Frage. Eine Vermutung, es ist nur eine Regel im Java-Compiler. Zum Beispiel gibt der folgende Code eine Liste <Integer []> Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
Simon

167

In Java 8 können Sie Streams verwenden:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

Das ist schön, aber es wird nicht funktionieren boolean[]. Ich denke, das liegt daran, dass es genauso einfach ist, eine zu erstellen Boolean[]. Das ist wahrscheinlich eine bessere Lösung. Wie auch immer, es ist eine interessante Eigenart.
GlenPeterson

138

Wenn Sie über die Konvertierungsmethode sprechen, hängt es davon ab, warum Sie Ihre benötigen List. Wenn Sie es nur zum Lesen von Daten benötigen. Ok, hier hast du es:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Aber wenn Sie so etwas tun:

list.add(1);

du bekommst java.lang.UnsupportedOperationException. In einigen Fällen benötigen Sie sogar Folgendes:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

Der erste Ansatz konvertiert das Array eigentlich nicht, sondern repräsentiert es wie ein List. Das Array befindet sich jedoch unter der Haube mit all seinen Eigenschaften wie einer festen Anzahl von Elementen. Bitte beachten Sie, dass Sie beim Erstellen einen Typ angeben müssen ArrayList.


1
"Unveränderlichkeit" verwirrte mich für einen Moment. Sie können natürlich die Werte des Arrays ändern. Sie können die Größe jedoch nicht ändern.
Tim Pohlmann

125

Das Problem ist, dass varargs in Java5 eingeführt wurde und leider auch Arrays.asList()mit einer vararg-Version überladen wurde. So Arrays.asList(spam)wird durch den Java5 Compiler als Vararg Parameter int Arrays verstanden.

Dieses Problem wird ausführlicher in Effective Java 2nd Ed., Kapitel 7, Punkt 42 erläutert.


4
Ich verstehe, was passiert ist, aber nicht, warum es nicht dokumentiert ist. Ich suche nach einer alternativen Lösung, ohne das Rad neu zu implementieren.
Alexandru

2
@UsmanIsmail Ab Java 8 können wir Streams für diese Konvertierung verwenden. Siehe meine Antwort unten .
Ibrahim Arief

109

Es scheint etwas spät zu sein, aber hier sind meine zwei Cent. Wir können nicht haben, List<int>wie intes ein primitiver Typ ist, also können wir nur haben List<Integer>.

Java 8 (int Array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 und niedriger (Integer Array)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

Benötigen Sie ArrayList und nicht List?

Wenn wir eine spezifische Implementierung von ListzB ArrayListwollen, können wir verwenden toCollectionals:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

Warum list21kann nicht strukturell verändert werden?

Wenn wir Arrays.asListdie Größe der zurückgegebenen Liste verwenden, ist dies fest, da es sich bei der zurückgegebenen Liste nicht um java.util.ArrayListeine private statische Klasse handelt, die darin definiert ist java.util.Arrays. Wenn wir also Elemente zur zurückgegebenen Liste hinzufügen oder daraus entfernen, UnsupportedOperationExceptionwird ein ausgelöst. Wir sollten also weitermachen, list22wenn wir die Liste ändern möchten. Wenn wir Java8 haben, können wir auch mit gehen list23.

Klar zu sein list21kann in dem Sinne geändert werden, dass wir es aufrufen können, list21.set(index,element)aber diese Liste kann möglicherweise nicht strukturell geändert werden, dh es können keine Elemente zur Liste hinzugefügt oder daraus entfernt werden. Sie können diese Frage auch überprüfen .


Wenn wir eine unveränderliche Liste wollen, können wir sie wie folgt umschließen:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

Ein weiterer zu beachtender Punkt ist, dass die Methode Collections.unmodifiableListeine nicht veränderbare Ansicht der angegebenen Liste zurückgibt. Eine nicht modifizierbare Ansichtssammlung ist eine Sammlung, die nicht modifizierbar ist und auch eine Ansicht auf eine Hintergrundsammlung darstellt. Beachten Sie, dass Änderungen an der Hintergrundsammlung möglicherweise weiterhin möglich sind. Wenn sie auftreten, sind sie in der nicht veränderbaren Ansicht sichtbar.

Wir können eine wirklich unveränderliche Liste in Java 9 und 10 haben.

Wirklich unveränderliche Liste

Java 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

Java 10 (wirklich unveränderliche Liste) auf zwei Arten:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

Überprüfen Sie auch meine Antwort für mehr.


@BasilBourque Ich meinte, ich kann die Struktur der Liste nicht durch Hinzufügen / Löschen ändern, sondern die Elemente ändern.
akhil_mittal

In der Tat habe ich einen Code ausprobiert und diesen Anruf bestätigt List::add & List::removemit einer von zurückgegebenen Liste fehlschlägt Arrays.asList. Das JavaDoc für diese Methode ist schlecht geschrieben und in diesem Punkt unklar. Bei meiner dritten Lesung sollte der Ausdruck „feste Größe“ sagen, dass man keine Elemente hinzufügen oder entfernen kann.
Basil Bourque


11

Ich musste kürzlich ein Array in eine Liste konvertieren. Später hat das Programm die Liste gefiltert, um die Daten zu entfernen. Wenn Sie die Funktion Arrays.asList (Array) verwenden, erstellen Sie eine Sammlung mit fester Größe: Sie können weder hinzufügen noch löschen. Dieser Eintrag erklärt das Problem besser als ich kann: Warum erhalte ich eine UnsupportedOperationException, wenn ich versuche, ein Element aus einer Liste zu entfernen? .

Am Ende musste ich eine "manuelle" Konvertierung durchführen:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

Ich nehme an, ich hätte mithilfe einer List.addAll-Operation (items) eine Konvertierung von einem Array zu einer Liste hinzufügen können.


11
new ArrayList<ListItem>(Arrays.asList(itemsArray))würde das gleiche
Marco13

1
@BradyZhu: Zugegeben, die obige Antwort löst mein Problem mit dem Array mit fester Größe nicht, aber Sie sagen hier im Grunde RTFM, was immer eine schlechte Form ist. Bitte erläutern Sie, was mit der Antwort nicht stimmt, oder kommentieren Sie nicht.
Steve Gelman

2
Inspektionswerkzeuge können hier eine Warnung anzeigen, und Sie haben den Grund angegeben. Es ist nicht erforderlich, die Elemente manuell zu kopieren. Verwenden Sie Collections.addAll(items, itemsArray)stattdessen.
Darek Kay

Schlagen Sie einfach diese Ausnahme. Ich fürchte, die Antwort von Marco13 sollte die richtige sein. Möglicherweise muss ich den Code für das ganze Jahr durchgehen, um alle "asList" -Ausnahmen zu beheben.

7

Arrays verwenden

Dies ist der einfachste Weg, ein Array in zu konvertieren List. Wenn Sie jedoch versuchen, ein neues Element hinzuzufügen oder ein vorhandenes Element aus der Liste zu entfernen, wird ein Element UnsupportedOperationExceptionausgelöst.

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

Verwenden von ArrayList- oder anderen Listenimplementierungen

Sie können eine forSchleife verwenden, um alle Elemente des Arrays zu einer ListImplementierung hinzuzufügen , z ArrayList.

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

Verwenden der Stream-API in Java 8

Sie können das Array in einen Stream verwandeln und dann den Stream mit verschiedenen Kollektoren sammeln: Der Standardkollektor in Java 8 wird ArrayListhinter dem Bildschirm verwendet, aber Sie können auch Ihre bevorzugte Implementierung festlegen.

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

Siehe auch:


6

Eine weitere Problemumgehung, wenn Sie Apache commons-lang verwenden:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

Wo ArrayUtils.toObject Konvertiten int[]zuInteger[]


5

Sie müssen in Array umwandeln

Arrays.asList((Object[]) array)

3
Java: inkompatible Typen: int [] kann nicht in java.lang.Object [] konvertiert werden
dVaffection

@dVaffection Dann in int [] umwandeln. Ein wichtiger Teil ist die Umwandlung in ein Array.
Nebril

5

Einzeiler:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});


5

Wenn Sie auf Java 8 (oder höher) abzielen, können Sie Folgendes versuchen:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

HINWEIS:

Beachten Collectors.<Integer>toList()Sie, dass diese generische Methode Ihnen hilft, den Fehler "Typinkongruenz: Konvertiert nicht von List<Object>nach List<Integer>" zu vermeiden .


4
  1. Verwenden von Guave:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  2. Verwenden von Apache Commons-Sammlungen:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);

3

Wenn dies hilft: Ich hatte das gleiche Problem und habe einfach eine generische Funktion geschrieben, die ein Array verwendet und eine ArrayList desselben Typs mit demselben Inhalt zurückgibt:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

Was ist, wenn es nicht hilft? Was hast du dann gemacht? ... jk :)
Am 5.

2

Gegebenes Array:

    int[] givenArray = {2,2,3,3,4,5};

Konvertieren eines Integer-Arrays in eine Integer-Liste

Eine Möglichkeit: boxed () -> gibt den IntStream zurück

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

Zweiter Weg: Ordnen Sie jedes Element des Streams Integer zu und sammeln Sie es dann

HINWEIS: Mit mapToObj können Sie jedes int-Element in einen String-Stream, einen Char-Stream usw. umwandeln, indem Sie i in (char) i setzen

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

Konvertieren eines Array-Typs in einen anderen Typ Beispiel:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

1

Es hängt also davon ab, welche Java-Version Sie versuchen.

Java 7

 Arrays.asList(1, 2, 3);

ODER

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

ODER

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

In Java 8

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

Referenz - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/


1

Können Sie diese Antwort bitte verbessern, da dies das ist, was ich benutze, aber ich bin nicht 100% klar. Es funktioniert gut, aber IntelliJ hat eine neue WeatherStation hinzugefügt [0]. Warum die 0?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


Warum sollten wir Ihre Frage verbessern ? Entweder du kennst die Antwort oder du weißt es nicht. Sie sollten natürlich eine Antwort geben, die anderen wirklich hilft, und nicht eine, die mehr verwirrt als hilft.
HimBromBeere

-2

Verwenden Sie zwei Codezeilen, um das Array in eine Liste zu konvertieren. Wenn Sie es als ganzzahligen Wert verwenden, müssen Sie den Autoboxing-Typ für den primitiven Datentyp verwenden

  Integer [] arr={1,2};
  Arrays.asList(arr);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.