Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:java:algorithmen:assoziative_arrays:start [04.12.2022 18:56] – Frank Schiebel | faecher:informatik:oberstufe:java:algorithmen:assoziative_arrays:start [31.03.2025 16:36] (aktuell) – [Anmerkung zu Wrapper-Klassen] Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Assoziative Arrays ====== | ====== Assoziative Arrays ====== | ||
+ | |||
+ | ===== Beispiel ===== | ||
+ | |||
+ | Wir wollen die Hauptstädte einiger Länder Speichern, d.h. wir benötigen eine Zuordnung wie | ||
+ | |||
+ | Hauptstadt von Frankreich = Paris | ||
+ | |||
+ | Es verhält sich also ebenso wie bei gewöhnlichen Arrays, wir wollen viele gleichartige Objekte Speichern (Hauptstädte). Allerdings wäre es in diesem fall günstig, wenn wir bei der Art der Speicherung direkt einen Zusammenhang zum Land herstellen könnten. Ein Ausdruck in der Art '' | ||
+ | |||
+ | |||
+ | ===== Definition ===== | ||
+ | |||
<WRAP center round info 90%> | <WRAP center round info 90%> | ||
- | Ein assoziatives Array (auch Dictionary, Liste von Schlüssel-Wert-Paaren oder assoziatives Datenfeld) ist eine Datenstruktur, | + | Ein **assoziatives Array** (auch Dictionary, Liste von Schlüssel-Wert-Paaren oder assoziatives Datenfeld) ist eine Datenstruktur, |
- | in einer festgelegten Reihenfolge abgespeichert. Idealerweise werden die Schlüssel so gewählt, dass eine für die Programmierer nachvollziehbare Verbindung zwischen Schlüssel und Datenwert besteht. Die meisten Programmiersprachen unterstützen assoziative | + | in einer festgelegten Reihenfolge abgespeichert. Idealerweise werden die Schlüssel so gewählt, dass eine für die Programmierer nachvollziehbare Verbindung zwischen Schlüssel und Datenwert besteht. Die meisten Programmiersprachen unterstützen assoziative |
</ | </ | ||
+ | |||
+ | ===== Benutzung in Java ===== | ||
+ | |||
+ | Assoziative Arrays werden in Java durch die " | ||
+ | |||
+ | <code java> | ||
+ | import java.util.HashMap; | ||
+ | </ | ||
+ | |||
+ | dann kann man im Programmcode ein assoziatives Array folgendermaßen definieren: | ||
+ | <code java> | ||
+ | // Assoziatives Array, die Keys sind vom Typ String, die Werte sind vom Typ String | ||
+ | // das ist für unser Hauptstadtbeispiel sinnvoll. | ||
+ | HashMap< | ||
+ | </ | ||
+ | [[https:// | ||
+ | |||
+ | ===== Wichtige Methoden bei der Verwendung von HashMaps ===== | ||
+ | |||
+ | ==== Elemente hinzufügen ==== | ||
+ | |||
+ | Um einer HashMap ein Element hinzuzufügen, | ||
+ | |||
+ | <code java> | ||
+ | [...] | ||
+ | import java.util.HashMap; | ||
+ | [...] | ||
+ | |||
+ | [...] | ||
+ | // Erzeuge eine HashMap Objekt | ||
+ | HashMap< | ||
+ | [...] | ||
+ | |||
+ | [...] | ||
+ | // Schlüssel/ | ||
+ | hauptstadt.put(" | ||
+ | hauptstadt.put(" | ||
+ | hauptstadt.put(" | ||
+ | hauptstadt.put(" | ||
+ | System.out.println(capitalCities); | ||
+ | [...] | ||
+ | </ | ||
+ | |||
+ | ==== Ein Element auslesen ==== | ||
+ | |||
+ | |||
+ | |||
+ | Um den Wert eines Elements einer HashMap auszulesen verwendet man die get()-Methode mit dem Schlüssel des Elements: | ||
+ | |||
+ | <code java> | ||
+ | String hsengland = hauptstadt.get(" | ||
+ | </ | ||
+ | |||
+ | ==== Elemente löschen ==== | ||
+ | |||
+ | Elemente löschen kann man unter Angabe des Schlüssels mit der Methode remove(). | ||
+ | |||
+ | <code java> | ||
+ | hauptstadt.remove(" | ||
+ | </ | ||
+ | |||
+ | Um **alle** Elemente zu löschen, kann man die Methode clear() verwenden: | ||
+ | |||
+ | <code java> | ||
+ | hauptstadt.clear(); | ||
+ | </ | ||
+ | |||
+ | ==== Anzahl der Elemente herausfinden ==== | ||
+ | |||
+ | Mit Hilfe der Methode size() kann man die Zahl der Elemene in den HashMap herausfinden: | ||
+ | |||
+ | <code java> | ||
+ | int elementAnzahl = hauptstadt.size(); | ||
+ | </ | ||
+ | |||
+ | ==== Operationen auf allen Elementen: Eine HashMap mit einer Schleife durchlaufen ==== | ||
+ | |||
+ | Die Elemente einer HashMap kann man mit einer foreach-Schleife durchlaufen. Dabei hat man im wesentlichen zwei Möglichkeiten: | ||
+ | |||
+ | **(1) Man durchläuft die Menge aller Schlüssel und beschafft sich die Werte zu den Schlüsseln mit der get()-Methode** | ||
+ | |||
+ | Die Menge aller Schlüssel erhält man mit der Methode keySet(). | ||
+ | |||
+ | <code java> | ||
+ | // Gibt die Schlüssel aus | ||
+ | for (String key : hauptstadt.keySet()) { | ||
+ | System.out.println(key); | ||
+ | } | ||
+ | |||
+ | // Gibt Schlüssel und Werte aus | ||
+ | for (String key : hauptstadt.keySet()) { | ||
+ | System.out.println(" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **(2) Wenn man an den Schlüsseln nicht interessiert ist, kann man direkt die Werte durchlaufen** | ||
+ | |||
+ | Mit der Methode values() kann man sich direkt die Menge der Werte beschaffen, und diese mit einer foreach-Schleife durchlaufen. | ||
+ | |||
+ | <code java> | ||
+ | // Nur die Werte beschaffen und ausgeben | ||
+ | for (String stadt : hauptstadt.values()) { | ||
+ | System.out.println(stadt); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Anmerkung zu Wrapper-Klassen ===== | ||
+ | |||
+ | |||
+ | Schlüssel und Werte bei HashMaps sind stets **Objekte**. Aus diesem Grund schlägt eine Verwendung mit primitiven Datentypen wie int, char , double fehl: '' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Das Problem wird gelöst, indem man für die primitiven Datentypen die zugehörigen Wrapper-Klassen verwendet: | ||
+ | |||
+ | <code java> | ||
+ | HashMap< | ||
+ | </ | ||
+ | |||
+ | ==== Übersicht über die Wrapper-Klassen ==== | ||
+ | |||
+ | |||
+ | ^ Primitiver Typ ^ Wrapper Klasse | ||
+ | | byte | Byte | | ||
+ | | short | ||
+ | | int | ||
+ | | long | Long | | ||
+ | | float | ||
+ | | double | ||
+ | | char | Character | ||
+ | | boolean | ||
+ | |||
+ | |||