Part 8

Gruppierung von Daten mit HashMaps

Lernziele

  • Sie wissen, wie man eine Liste als Wert in einer HashMap verwendet.
  • Sie wissen, wie man Daten mit einer HashMap kategorisiert.

Eine HashMap hat höchstens einen Wert pro Schlüssel. Im folgenden Beispiel speichern wir die Telefonnummern von Personen in der HashMap.

HashMap<String, String> phoneNumbers = new HashMap<>();
phoneNumbers.put("Pekka", "040-12348765");

System.out.println("Pekka's Number " + phoneNumbers.get("Pekka"));

phoneNumbers.put("Pekka", "09-111333");

System.out.println("Pekka's Number " + phoneNumbers.get("Pekka"));
Beispielausgabe

Pekka's number: 040-12348765 Pekka's number: 09-111333

Was, wenn wir mehrere Werte einem einzigen Schlüssel zuweisen möchten, wie zum Beispiel mehrere Telefonnummern für eine bestimmte Person?

Da Schlüssel und Werte in einer HashMap beliebige Variablen sein können, ist es auch möglich, Listen als Werte in einer HashMap zu verwenden. Sie können weitere Werte zu einem einzigen Schlüssel hinzufügen, indem Sie eine Liste dem Schlüssel zuordnen. Lassen Sie uns die Art und Weise ändern, wie die Nummern gespeichert werden:

HashMap<String, ArrayList<String>> phoneNumbers = new HashMap<>();

Jeder Schlüssel der HashMap hat nun eine Liste zugeordnet. Obwohl der neue Befehl eine HashMap erstellt, enthält die HashMap anfangs keine einzige Liste. Diese müssen bei Bedarf separat erstellt werden.

HashMap<String, ArrayList<String>> phoneNumbers = new HashMap<>();

// Zuerst eine leere Liste mit dem Namen Pekka verbinden
phoneNumbers.put("Pekka", new ArrayList<>());

// und eine Telefonnummer zur Liste von Pekka hinzufügen
phoneNumbers.get("Pekka").add("040-12348765");
// und eine weitere Telefonnummer hinzufügen
phoneNumbers.get("Pekka").add("09-111333");

System.out.println("Pekka's numbers: " + phoneNumbers.get("Pekka"));
Beispielausgabe

Pekka's number: [040-12348765, 09-111333]

Wir definieren den Typ der Telefonnummern als HashMap<String, ArrayList<String>>. Dies bezieht sich auf eine HashMap, die einen String als Schlüssel und eine Liste, die Strings enthält, als Wert verwendet. Somit sind die in die HashMap eingefügten Werte konkrete Listen.

// Zuerst eine leere ArrayList als Wert für Pekka hinzufügen
phoneNumbers.put("Pekka", new  ArrayList<>());

// ...

Wir können zum Beispiel ein Programm zur Nachverfolgung von Übungspunkten auf ähnliche Weise implementieren. Das folgende Beispiel skizziert die Klasse TaskTracker, die eine benutzerbezogene Nachverfolgung von Punkten aus Aufgaben beinhaltet. Der Benutzer wird als String und die Punkte als Ganzzahlen dargestellt.

public class TaskTracker {
    private HashMap<String, ArrayList<Integer>> completedExercises;

    public TaskTracker() {
        this.completedExercises = new HashMap<>();
    }

    public void add(String user, int exercise) {
        // Eine leere Liste muss für einen neuen Benutzer hinzugefügt werden, falls noch keine hinzugefügt wurde
        this.completedExercises.putIfAbsent(user, new ArrayList<>());

        // Zuerst die Liste der vom Benutzer abgeschlossenen Aufgaben abrufen und dieser Liste hinzufügen
        ArrayList<Integer> completed = this.completedExercises.get(user);
        completed.add(exercise);

        // Das Vorherige würde auch ohne die Hilfsvariable wie folgt funktionieren
        // this.completedExercises.get(user).add(exercise);
    }

    public void print() {
        for (String name: completedExercises.keySet()) {
            System.out.println(name + ": " + completedExercises.get(name));
        }
    }
}
TaskTracker tracker = new TaskTracker();
tracker.add("Ada", 3);
tracker.add("Ada", 4);
tracker.add("Ada", 3);
tracker.add("Ada", 3);

tracker.add("Pekka", 4);
tracker.add("Pekka", 4);

tracker.add("Matti", 1);
tracker.add("Matti", 2);

tracker.print();
Beispielausgabe

Matti: [1, 2] Pekka: [4, 4] Ada: [3, 4, 3, 3]

Loading
Loading
Sie haben das Ende dieses Abschnitts erreicht! Weiter zum nächsten Abschnitt: