/ / HashMap Eintrag löschen UND Position - Java, Hashmap

HashMap Eintrag löschen UND Position - Java, Hashmap

Ich arbeite nur mit HashMaps und jetzt taucht eine Frage auf, die ich selbst nicht beantworten kann ...

In meiner HashMap gibt es einige Einträge. Ich suche jetzt in allen Einträgen nach einem bestimmten Wert. Wenn dieser Wert gefunden wird, wird er mit gelöscht hashmap.remove();. Ich will aber nicht "nur" den Eintrag löschen sonderndie gesamte "Position" der HashMap, so dass kein Leerzeichen dazwischen ist. Am Ende sollte die HashMap keinen Wert mehr haben (Ich denke, sie wird dann null sein, nicht wahr?)

Gibt es eine Möglichkeit, dies zu tun?

Das ist es, was ich bisher bekommen habe, aber es löscht nur den Eintrag, nicht die gesamte Position ...

for (Entry<Integer, String> entry : myMap.entrySet()) {
if (entry.getValue().contains("EnterStringHere")) {
myMap.remove(entry);
}
}

Antworten:

1 für die Antwort № 1

Das ist falsch

for (Entry<Integer, String> entry : myMap.entrySet()) {
if (entry.getValue().contains("EnterStringHere")) {
myMap.remove(entry); // you should pass the key to remove
}
}

Sie können dieses Verfahren jedoch nicht zum Entfernen von Elementen verwenden. Sie erhalten ConcurrentModificationException.

Sie können dies mit versuchen iterator um das Element während der Iteration zu entfernen.

 Map<Integer,String> map=new HashMap<>();
map.put(1,"EnterStringHere");
map.put(2,"hi");
map.put(3,"EnterStringHere");
Iterator<Map.Entry<Integer,String>> iterator=map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer,String> entry=iterator.next();
if(entry.getValue().equals("EnterStringHere")){
iterator.remove();
}
}
System.out.println(map);

Ausgabe:

 {2=hi}

Sie müssen wirklich sehen HashMap # remove ()


1 für die Antwort № 2

Sie können das Eintragsobjekt nicht von einer Karte entfernen. Die Methode remove erwartet den Schlüssel.

Stattdessen können Sie Folgendes versuchen:

Iterator<Entry<Integer, String>> itr = myMap.entrySet().iterator();

while(itr.hasNext()) {
Entry<Integer, String> entry = itr.next();
if (entry.getValue().contains("EnterStringHere"))
{
itr.remove();
}
}

Außerdem können Sie a nicht direkt strukturell ändernBeim Durchlaufen von "Anderes" wird die Ausnahme "ConcurrentModification" angezeigt. Um dies zu verhindern, müssen Sie die im Iterator angegebene Methode remove verwenden, wie im obigen Code gezeigt.


0 für die Antwort № 3

Nehmen wir an, Sie haben eine Map<Key,Value> Größe von 10 und Sie möchten entfernen 8aktuelles Schlüsselwertpaar Map. Was passiert ist Map wird die Größe von 9 und es wird ein weiteres Schlüsselwertpaar in geben 8Position.

Sie können nicht darüber hinaus mit remove(). Sie können die Position nicht entfernen.

Aber wenn Sie verwenden Map.get(removed_key) Sie erhalten null da es dort jetzt keinen schlüssel gibt.

Z.B:

Map<String,Integer> map=new HashMap<>();
map.put("a",1);
map.put("b",2);
map.put("c", 3);
System.out.println("size of the map "+map.size() +" map is "+map);
map.remove("b");
System.out.println("size of the map "+map.size() +" map is "+map);
System.out.println(map.get("b"));

Ausgabe:

size of the map 3 map is {b=2, c=3, a=1}
size of the map 2 map is {c=3, a=1}
null // you are getting null since there is no key "b"

Hinzufügen, um eine Antwort auf Ihren Kommentar zu geben. Wenn Sie prüfen möchten, ob die Karte leer ist. einfach benutzen map.isEmpty()


0 für die Antwort № 4

Verstehen wie HashMap arbeitet hier Verknüpfung. Siehe auch Java Doc hier Verknüpfung.

Wenn Sie das Packen Ihrer Hashmap festlegen möchten, versuchen Sie, die Größe der Map zu überprüfen, löschen Sie eine und überprüfen Sie die Größe beispielsweise erneut.

hashmap.size();        => 10
hashmap.remove(obj);
hashmap.size()         => 9

Dies bedeutet, dass die Hashmap gepackt ist und keinen leeren Eintrag enthält. Am Ende wird die Hashmap automatisch keinen Wert enthalten


0 für die Antwort № 5

Denn nach einer gewissen Zeit muss ich nachsehen, obDie HashMap ist leer. Aber eine andere Antwort scheint den Hinweis zu bekommen, den ich brauchte. Wenn ich den Wert lösche, ist der Eintrag null? Kann ich überprüfen, ob jeder Eintrag leicht null ist, oder muss ich jeden Eintrag erneut durchlaufen?

Sie löschen keinen Wert aus einer Zuordnung, die Sie löschen. Dieser Code löscht nichts:

myMap.remove(entry);

Da Sie das Eingabeobjekt übergeben, müssen Sie den Schlüssel des Mappings übergeben, um es zu löschen, siehe Map.html # entfernen Dokumente

so

myMap.remove(entry.getkey());

Mit dem aktuellen Ansatz werden Sie jedoch in ausführen ConcurrentModificationException. Wenn es bis jetzt nicht geschah, dann nur, weil Ihr Code nichts gelöscht hat. weil Sie das Eintragsobjekt übergeben

Wenn Sie das Mapping aus der Map löschen, ist dieses Mapping in der Map nicht mehr vorhanden. Ob der Eimer ist null oder nicht ist Implementierungsdetail, aber wenn Sie eine Zuordnung abfragen, die mit dem angegebenen Schlüssel gelöscht wurde, werden Sie bekommen null als Rückgabewert. Wenn Sie eine weitere Zuordnung mit demselben Schlüssel hinzufügen, erhalten Sie diese Zuordnung erneut.

Sie können mit prüfen, ob eine Karte leer ist Map # isEmptySie müssen daher nicht überprüfen, ob jeder Eintrag null ist, oder die gesamte Map durchlaufen, um dies zu tun.

Mit können Sie überprüfen, ob eine Karte eine Zuordnung für einen Schlüssel enthält Map. # EnthältKey

Mit können Sie überprüfen, ob eine Karte mindestens eine Zuordnung für einen Wert enthält Karte # enthältWert

der richtige Weg, um Etriey von einer Karte zu löschen, während Sie es iterieren, um ein zu verwenden iterator

Iterator<Entry<Integer, String>> iterator = myMap.entrySet().iterator();
while(iterator.hasNext()) {
Entry<Integer, String> entry = iterator.next();
if (entry.getValue().contains("foo")) {
iterator.remove();
}
}

Da hast du Map<Integer, String> Ich gehe davon aus, dass die Position du meinst ist der integer schlüssel, wo du sowas machst myMap.put(1, "."), myMap.put(2, ".."), myMap.put(3, "...") und so weiter. In diesem Fall entfernen Sie die Zuordnung für den Schlüssel 1 zum Beispiel die Position, d. h. das Mapping {1 : "."} wird nicht mehr in der Karte existieren.


-1 für die Antwort № 6

OK, ich habe ein codierbares Beispiel, das ziemlich einfach ist.

public class TestingThingsOut {

public static void main(String [] args) {
HashMap<Integer, String> myMap = new HashMap<Integer, String>();

myMap.put(123, "hello");
myMap.put(234, "Bye");
myMap.put(789, "asdf");

System.out.println(myMap); // it says:
{789=asdf, 234=Bye, 123=hello}

System.out.println(myMap.size()); // it says: "3"

for (Entry<Integer, String> entry : myMap.entrySet()) {
if (entry.getValue().contains("hello")) {
myMap.remove(entry);
}
}

System.out.println(myMap); // it says:
{789=asdf, 234=Bye, 123=hello}

System.out.println(myMap.size()); // it says: "3" again
}

}