2017-06-21 1 views
1

J'essaie d'en apprendre davantage sur HashMaps et j'espérais obtenir de l'aide pour supprimer des valeurs (dans ce cas, des endroits). J'ai 3 HashMaps (perName, perCategory, perPosition), 2 d'entre eux ont des listes de lieux en tant que valeurs et tous ont des chaînes/positions en tant que clés. Par conséquent, il peut y avoir différents endroits avec le même nom ou la même catégorie. Je voudrais supprimer un certain endroit de la liste des valeurs dans chaque HashMap basé sur si cet endroit est "marqué" ou non.Comment supprimer une valeur de HashMap avec une liste de valeurs dans Java?

Chaque place ajoutée est stockée dans toutes les HashMaps et les lieux marqués sont stockés dans une ArrayList distincte. J'essaye de faire une boucle dans ArrayList et de supprimer chacune de ses places/valeurs de chaque HashMap. Je ne veux pas enlever la clé car il pourrait y avoir d'autres endroits non marqués avec la même clé. Est-ce possible? Pour le moment, les endroits ne semblent pas disparaître quand j'essaie de les enlever.

J'ai essayé différentes méthodes, celle avec l'itérateur (qui pourrait être inutile) semble supprimer la clé entière, tandis que celle avec la boucle for ne supprime rien du tout. Faites-moi savoir si je n'ai pas fourni suffisamment d'informations pour résoudre ce problème. Je vous remercie.

private Map<Position, Place> perPosition = new HashMap<>(); 
    private Map<String, List<Place>> perCategory = new HashMap<>(); 
    private Map<String, List<Place>> perName = new HashMap<>() 

    //method 1 
    Iterator<Place> it = markedPlace.iterator(); 
       while (it.hasNext()) { 

       Place p = it.next(); 
       perPosition.remove(p.getPosition()); 
       perName.remove(p.getName()); 
       perCategory.remove(p.getCategory()); 
       p.setMarked(false); 
       p.setVisible(false); 
       it.remove(); 
      } 

    //method 2 
       for (Place p : markedPlace) { 
        for (Map.Entry<String, List<Place>> entry : perName.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perName.remove(entry.getValue()); 
         } 
        } 

        for (Map.Entry<String, List<Place>> entry : perCategory.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perCategory.remove(entry.getValue()); 
         } 
        } 

        for (Map.Entry<Position, Place> entry : perPosition.entrySet()) { 
         if (entry.getValue().equals(p)) { 
          perName.remove(entry.getKey()); 
         } 

         } 
        markedPlace.clear(); 

Répondre

2

entry.getValue() est de type p et List<Place> est de type Place. Donc pour les boucles perName et perCategory, les égales ne seront jamais vraies. Vous devez utiliser .contains(foo) à la place pour vérifier si un objet est dans la liste.

Vous essayez ensuite de purger les listes que vous souhaitez conserver. Vous voulez supprimer l'entrée de la liste, pas la carte.

if (entry.getValue().contains(p)) { 
    entry.getValue().remove(p); 
} 

Et puis la liste prend en charge remove collection, de sorte que vous pouvez simplement faire

for (Map.Entry<String, List<Place>> entry : perName.entrySet()) { 
    entry.getValue().remove(markedPlace); 
} 

En outre, dans la classe de place, assurez-vous substituez égaux et hashCode, ou bien il ne fonctionne que si les deux place des objets sont exactement le même objet instancié.