web-dev-qa-db-fra.com

Créer une liste mutable à partir d'un tableau?

J'ai un tableau que je voudrais transformer en List, afin de modifier le contenu du tableau.

Stack Overflow contient de nombreuses questions/réponses qui traitent de Arrays.asList() et expliquent comment il fournit uniquement une vue de liste du tableau sous-jacent et explique comment tenter de manipuler la liste résultante génère généralement une UnsupportedOperationException comme méthode de manipulation de la liste (par exemple, add(), remove(), etc.) ne sont pas implémentés par l'implémentation List fournie par Arrays.asList().

Mais je ne trouve pas d'exemple pour transformer un tableau en liste mutable. Je suppose que je peux parcourir le tableau et put() chaque valeur dans une nouvelle liste, mais je me demande s’il existe une interface permettant de le faire pour moi.

56
ericsoco

Un moyen simple:

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

Cela créera une liste modifiable - mais ce sera un copie du tableau d'origine. Changer la liste not changera le tableau. Vous pouvez le copier ultérieurement, bien sûr, en utilisant toArray.

Si vous voulez créer un --- mutable view sur un tableau, je pense que vous devrez l'implémenter vous-même.

97
Jon Skeet

Et si vous utilisez les API de Google Collection

Lists.newArrayList(myArray)
13
vsingh

Ce code simple utilisant l’API Stream incluse dans Java 8 crée une liste (ou vue) mutable contenant les éléments de votre tableau:

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

Ou, également valable:

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

Si vous utilisez Collections Eclipse (anciennement GS Collections ), vous pouvez utiliser FastList.newListWith(...) ou FastList.wrapCopy(...).

Les deux méthodes prennent varargs, vous pouvez donc créer le tableau en ligne ou transmettre un tableau existant.

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

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

La différence entre les deux méthodes est de savoir si le tableau est copié ou non. newListWith() ne copie pas le tableau et prend donc un temps constant. Vous devriez éviter de l'utiliser si vous savez que le tableau pourrait être muté ailleurs.

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);

Note: Je suis un partisan des collections Eclipse.

4
Craig P. Motlin

Ajout d'une autre option à l'aide de l'API Streams:

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