1. Listen, Sets und Maps im Überblick

[THEORIE]

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.

  • List ist geordnet und erlaubt Zugriff über einen Index — eine ganze Zahl, die die Position eines Elements angibt. Ein Element darf mehrfach vorkommen.
  • Set enthält nur eindeutige Elemente. Es bildet die mathematische Abstraktion einer Menge ab: eine Gruppe von Objekten ohne Duplikate.
  • Map speichert Schlüssel-Wert-Paare. Jeder Schlüssel ist eindeutig und zeigt auf genau einen Wert, Werte selbst dürfen sich aber wiederholen.
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)?

Weiterlesen

[VORHERSAGE]

Lies den Code genau durch, bevor du ihn ausführst.

vorhersage.kt
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?

[AUFGABE]

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).

aufgabe.kt
fun main() { // TODO: val produktNamen: List<String> = listOf(...) // TODO: val kategorien: Set<String> = setOf(...) // TODO: val preise: Map<String, Double> = mapOf(...) // TODO: drei println-Aufrufe: produktNamen.size, kategorien.size, preise["Hammer"] }

Bevor du einen Hint bekommst: Was hast du schon probiert, und woran hängt es genau?

[VERSTÄNDNIS-CHECK]

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?