101 votes

Supprimer() sur une liste créée par Arrays.asList() lance UnsupportedOperationException

J'ai une collection c1 et un tableau a. J'essaie de convertir le tableau en une collection c2 et de faire c1.removeAll(c2), mais cela lance une UnsupportedOperationException. J'ai découvert que la méthode asList() de la classe Arrays renvoie la classe Arrays.ArrayList et que cette classe hérite de la méthode removeAll() de la classe AbstractList() dont l'implémentation lance une UnsupportedOperationException.

    MyClass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

Y a-t-il un moyen de supprimer les éléments? S'il vous plaît aidez-moi

193voto

Etienne de Martel Points 16020

Arrays.asList retourne un wrapper List autour d'un tableau. Ce wrapper a une taille fixe et est directement soutenu par le tableau, et en tant que tel, les appels à set modifieront le tableau, et toute autre méthode qui modifie la liste lancera une UnsupportedOperationException.

Pour résoudre ce problème, vous devez créer une nouvelle liste modifiable en copiant le contenu de la liste wrapper. C'est facile à faire en utilisant le constructeur ArrayList qui prend un Collection:

Collection c = new ArrayList(Arrays.asList(la));

16voto

Bozho Points 273663

Oui, le Arrays.asList(..) est une collection qui ne peut pas être étendue ou rétrécie (car elle est basée sur le tableau d'origine et ne peut pas être redimensionnée).

Si vous souhaitez supprimer des éléments, créez un new ArrayList(Arrays.asList(..) ou supprimez directement des éléments du tableau (ce sera moins efficace et plus difficile à écrire)

8voto

henko Points 468

C'est ainsi que fonctionne Array.asList(), car il est directement soutenu par le tableau. Pour obtenir une liste entièrement modifiable, vous devriez cloner la collection dans une collection créée par vous-même.

Collection c = new ArrayList(Arrays.asList(la))

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