**This is an old revision of the document!**
<!DOCTYPE markdown>
HashMaps: Schlüssel-Wert-Paare
HashMaps sind eine weitere Datenstruktur, die bereits mit der JDK ausgeliefert werden. Sie funktionieren wie die Einträge in einem Wörterbuch: Unter einem Stichwort findet man eine Erklärung:
Eintrag1: Erklärung Eintrag2: Erklärung ... Eintrag1244: ErklärungDie einzelnen Einträge in eine
HashMap heißen nun nicht so, sonder sind Schlüssel-Werte-Paare, oder auf englisch: key-value. Für jeden key wird ein value gespeichert.
Es ist üblich, key und value mit k,v abzukürzen
Beachte: Um eindeutige Ergebnisse liefern zu können, kann jeder key nur ein mal vergeben werden. Sollten mehrere values unter einem key gespeichert werden (Spoiler: Das ist gar nicht so selten), muss als value wiederum eine Datenstruktur gewählt werden, die das Speichern von mehreren Werten zulässt, wie zum Beispiel ArrayList.
So kannst du unter Angabe des key den damit verknüpften value gelierfert bekommen.
Vorteile von HashMaps:
- Schneller Zugriff: Du kannst einen Wert mit seinem Schlüssel in konstanter Zeit (O(1)) abrufen, d.h., auch bei sehr vielen Einträgen wird der Suchvorgang schnell laufen.
- Flexibilität: Du kannst verschiedene Datentypen für Schlüssel und Werte verwenden.
- Dynamische Größe: HashMaps können automatisch wachsen, wenn du neue Einträge hinzufügst.
Einige Snippets zur Benutzung von HashMap
Wert zu Key hinzufuegen
map.put(k,v)
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); } }
Anzahl der Key-Value Paare zaehlen
map.size()
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); System.out.println("Anzahl der Paare: " + map.size()); } }
Eintrag entfernen
map.remove()
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); map.remove("Banane"); System.out.println(map); } }
Alle Eintraege entfernen
map.clear()
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); map.clear(); System.out.println(map); } }
Über alle Values der HashMap iterieren
map.values()
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); map.put("Orange", 5); int summe = 0; for (int wert : map.values()) { summe += wert; } System.out.println("Summe der Werte: " + summe); } }
SortedMap und TreeMap
SortedMap ist eine spezielle Map, die die einzelnen key-value-Paare sortiert ausgeben kann. Hierfür kann bei Bedarf ein Comperator eingefügt werden (s.u.)
SortedMap<> map = new TreeMap<>()
import java.util.SortedMap; import java.util.TreeMap; public class Main { public static void main(String[] args) { SortedMap<String, Integer> sortedMap = new TreeMap<>(); sortedMap.put("Apfel", 3); sortedMap.put("Banane", 2); sortedMap.put("Orange", 5); System.out.println(sortedMap); } }
Comperator
Der Comperator wird dem Konstruktor der TreeMap übergeben.
SortedMap<String, Integer> sortedMap = new TreeMap<>(Comparator.reverseOrder());
import java.util.SortedMap; import java.util.TreeMap; import java.util.Comparator; public class Main { public static void main(String[] args) { SortedMap<String, Integer> sortedMap = new TreeMap<>(Comparator.reverseOrder()); sortedMap.put("Apfel", 3); sortedMap.put("Banane", 2); sortedMap.put("Orange", 5); System.out.println(sortedMap); } }
Über alle Key-Value-Paare einer Map per forech-Loop iterieren
Mit einer foreach-loop kann über alle Einträge, das entrySet() iteriert werden. Ein einzelnes key-value-Paar ist vom Datentyp Map.Entry<>.
for (Map.Entry<String,Integer> e : map.entrySet()) { String s = e.getKey(); Integer i = e.getValue(); }
public class HashEntries { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); map.put("Clementine", 2); map.put("Xantippe", 2); map.put("Zote", 2); for (Map.Entry<String,Integer> e : map.entrySet()) { System.out.println(e.getKey() + " ... " + e.getValue()); } } }
Ueberpruefen, ob bestimmte keys oder values vorhanden sind.
map.containsKey(...); map.containsValue(...);
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); System.out.println("Enthält Apfel: " + map.containsKey("Apfel")); System.out.println("Enthält Wert 2: " + map.containsValue(2)); } }
Vor Änderung eines Values sicherstellen, dass ein Eintrag überhaupt existiert
Der value eines Eintrags ist nur zu ändern, wenn er überhaupt schon besteht.
map.containsKey(...)
...
if(map.containsKey(word)){
Integer v = map.get(word);
map.put(word,v+1);
}
else{
// wenn Eintrag nicht vorhanden:
// mit Standardwert initialisieren
map.put(word,1);
}
...
Standardwerte verwenden
Den Prozess des Überprüfens, ob ein Eintrag besteht, kann man abkürzen, indem man mit getOrDefault() einfach als zweiten Parameter einen Wert übergibt, der zurückgegeben werden soll, wenn der Eintrag noch nicht bestehen sollte.
map.getOrDefault(...);
import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apfel", 3); map.put("Banane", 2); int wert = map.getOrDefault("Orange", 0); System.out.println("Wert für 'Orange': " + wert); } }