104 votes

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

J'ai un tableau que j'aimerais transformer en un List afin de modifier le contenu du tableau.

Stack Overflow propose de nombreuses questions/réponses sur les sujets suivants Arrays.asList() et comment elle ne fournit qu'une vue en liste du tableau sous-jacent, et comment la tentative de manipulation de la liste résultante entraînera généralement une erreur d'affichage. UnsupportedOperationException comme des méthodes utilisées pour manipuler la liste (par ex. add() , remove() etc.) ne sont pas mis en œuvre par l'implémentation de la liste fournie par l'application Arrays.asList() .

Mais je n'arrive pas à trouver un exemple de la façon de transformer un tableau en une liste mutable. Je suppose que je peux faire une boucle dans le tableau et put() chaque valeur dans une nouvelle liste, mais je me demande s'il existe une interface qui puisse le faire pour moi.

145voto

Jon Skeet Points 692016

Un moyen simple :

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

Cela créera une liste mutable - mais ce sera un copie du tableau original. La modification de la liste no modifier le tableau. Vous pouvez le recopier plus tard, bien sûr, en utilisant toArray .

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

36voto

vsingh Points 1099

Et si vous utilisez les API de collecte de Google (Guava) :

Lists.newArrayList(myArray);

13voto

MikaelF Points 1228

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, tout aussi valable :

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

5voto

Craig P. Motlin Points 11814

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

Les deux méthodes prennent des varargues, de sorte que vous pouvez créer le tableau en ligne ou passer 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 committer pour Eclipse Collections.

0voto

Sid Points 1453
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X