Eine Collection fasst mehrere Objekte des gleichen Typs zusammen — ihre Anzahl kann dabei auch null sein. Objekte in einer Collection heißen Elemente. Kotlin kennt drei grundlegende Collection-Typen, die sich in einem Punkt unterscheiden: wie sie mit Reihenfolge und Duplikaten umgehen.
fun main() {
val produktNamen: List<String> = listOf("Hammer", "Zange", "Hammer")
val kategorien: Set<String> = setOf("Werkzeug", "Werkzeug", "Elektronik")
val preise: Map<String, Double> = mapOf("Hammer" to 12.5, "Zange" to 8.0)
println(produktNamen) // [Hammer, Zange, Hammer]
println(kategorien) // [Werkzeug, Elektronik]
println(preise["Hammer"]) // 12.5
}
List und Set haben mehr gemeinsam, als man auf den ersten Blick denkt: Beide implementieren das
Interface Collection, das wiederum Iterable erweitert. Deshalb funktioniert eine for-Schleife
für beide identisch:
val produktNamen = listOf("Hammer", "Zange")
val kategorien = setOf("Werkzeug", "Elektronik")
for (produkt in produktNamen) { println(produkt) }
for (kategorie in kategorien) { println(kategorie) }
Map steht dagegen außerhalb dieser Hierarchie — sie ist selbst kein Collection, sondern eine
eigene Abstraktion für Schlüssel-Wert-Paare. Iterieren kannst du trotzdem, üblicherweise über
entries mit Destructuring:
val preise = mapOf("Hammer" to 12.5, "Zange" to 8.0)
for ((produkt, preis) in preise) {
println("$produkt kostet $preis€")
}
Welchen der drei Typen du wählst, hängt von der Frage ab, die dein Code beantworten muss: Brauchst du die Reihenfolge und willst per Position zugreifen (List), musst du Duplikate ausschließen (Set), oder brauchst du eine schnelle Zuordnung von einem Schlüssel zu einem Wert (Map)?
Lies den Code genau durch, bevor du ihn ausführst.
fun main() {
val kategorien = listOf("Werkzeug", "Elektronik", "Werkzeug", "Büro")
val kategorienSet = kategorien.toSet()
println(kategorien.size)
println(kategorienSet.size)
}
Welche zwei Zahlen gibt dieses Programm aus?
Ein Lagerverwaltungssystem verwaltet Produkte. Deklariere val produktNamen als List<String> mit den Einträgen "Schraubendreher", "Hammer", "Schraubendreher", "Zange" (der Artikel "Schraubendreher" liegt tatsächlich zweimal im Lager, deshalb absichtlich doppelt). Deklariere val kategorien als Set<String> mit den Einträgen "Werkzeug", "Werkzeug", "Elektronik" — nutze dafür setOf. Deklariere val preise als Map<String, Double>, die den Produkten "Hammer" den Preis 12.5 und "Zange" den Preis 8.0 zuordnet. Gib zum Schluss produktNamen.size, kategorien.size und preise["Hammer"] aus (drei println-Aufrufe).
Bevor du einen Hint bekommst: Was hast du schon probiert, und woran hängt es genau?
1. Was liefert setOf("A", "A", "B")?
2. Welche Aussage über Map trifft zu?
3. Was stimmt über die Beziehung von List, Set und Map zueinander?