1
votes

java 8: supprimer l'élément de la liste s'il ne se trouve pas dans la clé de la carte

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?


7 commentaires

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 une UnsupportedOperationException


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


3 Réponses :


8
votes

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


0 commentaires

-1
votes

résolu en ajustant la ligne de code comme suit:

List<String> myList = Lists.newArrayList(Arrays.asList("a.b.c,c.d.e".split(",")));


0 commentaires

1
votes

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.


0 commentaires