2017-06-21 4 views
1

Ich versuche HashMaps zu lernen und hoffe auf Hilfe beim Entfernen von Werten (in diesem Fall Orte). Ich habe 3 HashMaps (perName, perCategory, perPosition), 2 von ihnen haben Listen von Orten als Werte und alle haben Strings/Positionen als Schlüssel. Daher kann es verschiedene Orte mit demselben Namen oder derselben Kategorie geben. Ich möchte einen bestimmten Ort aus der Werteliste in jeder HashMap entfernen, basierend darauf, ob dieser Ort "markiert" ist oder nicht.Wie entferne ich einen Wert von HashMap mit einer Liste von Werten in Java?

Jeder hinzugefügte Ort wird in allen HashMaps gespeichert, und die markierten Orte werden in einer separaten ArrayList gespeichert. Ich versuche, die ArrayList durchzulaufen und jeden ihrer Orte/Werte von jeder HashMap zu entfernen. Ich möchte den Schlüssel nicht entfernen, da es andere, nicht gekennzeichnete Orte mit demselben Schlüssel geben könnte. Ist das möglich? Im Moment scheinen die Orte nicht zu verschwinden, wenn ich versuche, sie zu entfernen.

Ich habe versucht verschiedene Methoden, die mit dem Iterator (die möglicherweise unnötig sein) scheint den gesamten Schlüssel zu entfernen, während der mit der for-Schleife überhaupt nichts entfernt. Lassen Sie es mich wissen, wenn ich nicht genügend Informationen zur Verfügung gestellt habe, um das Problem zu lösen. Vielen Dank.

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

Antwort

2

entry.getValue() vom Typ List<Place> und p Place Typ. Für die PerName- und PerCategory-Loops gilt also, dass die equals niemals wahr sind. Sie müssen stattdessen .contains(foo) verwenden, um zu prüfen, ob ein Objekt in der Liste ist.

Sie versuchen dann, die Listen zu löschen, die Sie behalten möchten. Sie möchten den Eintrag aus der Liste entfernen, nicht die Karte.

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

Und dann unterstützt Liste remove collection, so können Sie einfach tun

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

Auch in der Place Klasse, stellen Sie sicher, dass Sie Gleichen und hashcode außer Kraft setzen, sonst wird es nur, wenn beide Platz Objekte entsprechen sind das exakt instanziierte Objekt.

Verwandte Themen