Je voudrais supprimer tous les éléments de la liste dont le dernier caractère fractionné n'a pas été fondé comme clé dans une carte. J'utilise le code suivant:
List<String> myList = Arrays.asList("a.b.c,c.d.e".split(",")); myList.add("a.b.c"); Map myMap = new HashMap(); myMap.put("a","dumy"); myList.removeIf(el->!myMap.containsKey(el.substring(el.lastIndexOf('.') + 1)));
J'obtiens l'erreur suivante: La méthode a jeté l'exception 'java.lang.UnsupportedOperationException'
.
toute idée de ce que je a mal fait?
3 Réponses :
Arrays.asList ()
crée une liste de taille fixe. Vous ne pouvez pas ajouter de nouveaux éléments ou supprimer des éléments.
Vous pouvez utiliser new ArrayList <> (Arrays.asList (el))
résolu en ajustant la ligne de code comme suit:
List<String> myList = Lists.newArrayList(Arrays.asList("a.b.c,c.d.e".split(",")));
Pour expliquer un peu plus la raison pour laquelle l'ajout (et la suppression) d'une ArrayList
créé via Arrays.asList (array)
n'est pas autorisé et lance UnsupportedOperationException
, nous savons d'abord que ce que fait ce Arrays.asList (...)
est de convertir un tableau en son instance équivalente de ArrayList
:
String[] strArr = new String[]{"a","b","c"}; List<String> strList = Arrays.asList(strArr);
Ce qui se passe ici, c'est que votre strArr
est en fait un tableau de sauvegarde pour strList
, c'est-à-dire si vous modifiez strArr [0] code > alors la valeur de
strList.get (0)
suivra également, et vice versa. Oui, leurs valeurs se synchroniseront et resteront cohérentes les unes avec les autres. C'est pourquoi vous ne pouvez pas faire d'ajout ou de suppression pour strList
car le tableau de sauvegarde pleurera et paniquera car il ne peut pas le remplir car il est de longueur fixe (les tableaux sont toujours de taille fixe comme nous le savons, si vous besoin de redimensionner un tableau, vous devez créer un tout nouveau tableau, redimensionner un tableau existant n'est pas possible); ainsi il lance UnsupportedOperationException
.
Donc la solution, comme déjà mentionné par @ByeBye, est de l'envelopper avec une ArrayList
donc ce serait un nouveau ArrayList
indépendant sans aucun tableau de sauvegarde et a la liberté de faire des ajouts et des suppressions.
Pouvez-vous ajouter le code qui produit cette erreur? Ces types ont des fautes d'orthographe, etc.
la dernière ligne de code provoque l'erreur. j'ai mis à jour le code
Votre code fonctionne correctement. Je suppose que vous nous montrez le mauvais code et dans le code réel, vous utilisez quelque chose comme
Arrays.asList ()
ou une liste immuable.@ByeBye Aside
Arrays.asList
n'est pas immuable. Mais oui, en général, l'opération de suppression d'un élément d'une collection immuable peut provoquer uneUnsupportedOperationException
Eh bien, je construis la liste comme suit: List myList = Arrays.asList (cats.split (",")) ;. Est-ce la raison de cette erreur? comment le résoudre ?
@ user1167753 À moins que vous ne partagiez le contexte complet, personne ne pourrait y apporter de solution. Veuillez modifier la question et mettre à jour avec un exemple reproductible minimal pour le problème.
code mis à jour. la première ligne semble causer le problème. pourquoi et comment le résoudre? MERCI