Welche Datenstrukturen
kennen wir
schon?
Bild: C. Sahnwaldt
List
Map
Set
Diese Datenstrukturen (Collections) sind Schnittstellen, deren Methoden durch konkrete Implementierungen umgesetzt werden müssen, z.B. ArrayList<String>.
[E] bezieht sich auf den sog. generischen Typ, d.h. hier können sämtliche Klassen angegeben werden
Eingabe: "Marian"
{ Hash-Funktion }
Ausgabe: Bucket
| Bucket | Wert |
|---|---|
| 0 | Hans |
| ... | ... |
| 13 | Marian |
Hash-Tabellen können nahezu
genauso schnell auf Elemente zugreifen wie Arrays ➔ O(1)
(reale Laufzeit abhängig von Hash-Funktion)
[E] bezieht sich auf den sog. generischen Typ, d.h. hier können sämtliche Klassen angegeben werden
📦 import java.util.Set;
📦 import java.util.HashSet;
Sets sind sehr gut geeignet, wenn man sicherstellen möchte, dass keine Duplikate existieren dürfen.
boolean add(E element)
Fügt ein Element hinzu, wenn es noch nicht im Set vorhanden ist
Beispiel: set.add("Max");
boolean remove(Object o)
Entfernt ein bestimmtes Element aus dem Set
Beispiel: set.remove("Max");
boolean contains(Object o)
Prüft, ob ein bestimmtes Element im Set vorhanden ist.
Beispiel: set.contains("Max");
int size()
Liefert die Anzahl der gespeicherten Elemente
boolean isEmpty()
Prüft, ob das Set keine Elemente enthält.
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(2);
for(Integer elem : numbers) {
System.out.println(elem);
}
}
}Ausgabe:
1
2
Map speichert Daten als sog. Schlüssel-Wert-Paare (Key-Value-Pairs)
Jeder Schlüssel (Key) ist eindeutig, ein Wert darf mehrfach vorkommen
Suche nach einem Wert über den Schlüssel ist sehr schnell
→ O(1) für HashMap
Verändern der Map:
Einträge hinzufügen: put(K key, V value)
Einträge lesen: get(K key)
Einträge löschen: remove(K key)
Maps eignen sich sehr gut für als universelle "Nachschlagewerke".
[K] und [V] beziehen sich auf sog. generische Typen, d.h. hier können sämtliche Klassen angegeben werden.
[K] ist Key (=Schlüssel) und [V] ist Value (=Wert)
📦 import java.util.Map;
📦 import java.util.HashMap;
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Map<String, Integer> str2num = new HashMap<>();
// Schlüssel-Werte-Paare einfügen
str2num.put("Eins", 1);
str2num.put("Zweihundertdrei", 203);
// Schlüssel-Werte-Paare ausgeben
System.out.println(str2num.get("Eins"));
}
}V put(K key, V value)
map.put("Max", 20);V get(Object key)
null, wenn nicht vorhanden).map.get("Max");V remove(Object key)
map.remove("Max");boolean containsKey(Object key)
map.containsKey("Max");boolean containsValue(Object value)
int size()
boolean isEmpty()
void clear()
Set<K> keySet()
map.keySet();Collection<V> values()
map.values();Live
coding
public class Person {
private String name;
private boolean isActive;
public Person(String name, boolean isActive) {
this.name = name;
this.isActive = isActive;
}
}Welcher Wert soll hier als Schlüssel
dienen?
equal- und hashCode-Methodenimport java.util.Set;
import java.util.HashSet;
public class Main {
// Here is the start!
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
set.add(new Person("Marian"));
set.add(new Person("Marian"));
for (Person elem : set) {
System.out.println(elem.getName());
}
}
}
import java.util.Objects;
class Person {
String name;
Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
@Override
public boolean equals(Object otherObject) {
String other = ((Person) otherObject).getName();
return this.name.equals(other);
}
@Override
public int hashCode() {
return Objects.hash(this.name);
}
}
📦 import java.util.Objects;
Bild: C. Sahnwaldt
Je nach Anwendungsfall sind unterschiedliche Datenstrukturen geeignet
Easy going: Listen (v.a. ArrayList)
Schneller Zugriff (bei vielen Elementen): Map
Nachschlagen (z.B. "read" → "lesen"): Map
Duplikate vermeiden: Set
Bei eigenen Klassen müssen equals() und hashCode() überschrieben werden