webentwicklung-frage-antwort-db.com.de

Erstellbare Liste aus einem Array erstellen?

Ich habe ein Array, das ich in eine List umwandeln möchte, um den Inhalt des Arrays zu ändern.

Stack Overflow enthält eine Vielzahl von Fragen/Antworten, die sich mit Arrays.asList() befassen und zeigen, wie nur eine Listenansicht des zugrunde liegenden Arrays bereitgestellt wird und wie der Versuch, die resultierende Liste zu manipulieren, im Allgemeinen eine UnsupportedOperationException als Methoden zum Manipulieren der Liste auslöst (z add(), remove() usw.) werden von der von Arrays.asList() bereitgestellten Listenimplementierung nicht implementiert.

Ich kann jedoch kein Beispiel finden, wie ein Array in eine veränderliche Liste umgewandelt wird. Ich vermute, ich kann das Array und put() jeden Wert in eine neue Liste durchlaufen, aber ich frage mich, ob es eine Schnittstelle gibt, die dies für mich erledigt.

56
ericsoco

Ein einfacher Weg:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

Dadurch wird eine veränderliche Liste erstellt - es handelt sich jedoch um eine copy des ursprünglichen Arrays. Durch Ändern der Liste wird das Array durch not geändert. Sie können es natürlich später mit toArray wieder kopieren.

Wenn Sie ein veränderbares view in einem Array erstellen möchten, müssen Sie dies wahrscheinlich selbst implementieren.

88
Jon Skeet

Und wenn Sie Google Collection-APIs verwenden

Lists.newArrayList(myArray)
13
vsingh

Dieser einfache Code, der die in Java 8 enthaltene Stream-API verwendet, erstellt eine veränderliche Liste (oder Ansicht), die die Elemente Ihres Arrays enthält:

Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));

Oder gleichermaßen gültig:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
5
MikaelF

Wenn Sie Eclipse Collections (früher GS Collections ) verwenden, können Sie FastList.newListWith(...) oder FastList.wrapCopy(...) verwenden.

Beide Methoden benötigen varargs, sodass Sie das Array inline erstellen oder in ein vorhandenes Array übergeben können.

MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);

Der Unterschied zwischen den beiden Methoden besteht darin, ob das Array kopiert wird oder nicht. newListWith() kopiert das Array nicht und benötigt daher konstante Zeit. Sie sollten es nicht verwenden, wenn Sie wissen, dass das Array an anderer Stelle mutiert sein könnte.

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);

Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);

Hinweis: Ich bin ein Committer für Eclipse Collections.

4
Craig P. Motlin

Hinzufügen einer weiteren Option mithilfe der Streams-API:

List<Foo> list = Arrays.stream(array).collect(Collectors.toList());
0
Sahil Chhabra
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
0
Sid