{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `TextAnalyzer` rufst du `counter.topWordK(3)` auf, aber in `WordCounter` ist `topWordK(int k)` nicht `public`; aus einem anderen Klassenfile heraus ist die Methode so nicht zugreifbar (wenn sie nicht im gleichen File/als innere Klasse wäre).\n- Deine `topWordK(int k)` liefert nicht “das k-häufigste Wort” bzw. “die k häufigsten Wörter”, sondern (je nach Datenlage) alle Wörter, die genau die k‑te Häufigkeit haben; das passt nicht zur Zusatzaufgabe (“das am k-häufigsten vorkommende Wort” oder “ein Array mit den k häufigsten Wörtern”).\n- Deine `topWordK(int k)` arbeitet nur mit **einzigartigen Häufigkeitszahlen** (`if(!list.contains(number))`), dadurch kann das Ergebnis falsch werden, sobald mehrere Wörter gleich häufig sind (Ties werden beim Ranking nicht korrekt berücksichtigt).\n- Wenn es weniger als `k` unterschiedliche Häufigkeiten/Wörter gibt, kann `list.getLast()` bzw. `list.get(k-1)`-Logik implizit scheitern (z.B. leere Liste) – damit erfüllt die Methode nicht robust die erwartete Aufgabe.\n\n### Suggestion\n- Mach `topWordK` so sichtbar, dass `TextAnalyzer` sie aufrufen darf (überlege: gleiche Package vs. `public`).\n- Entscheide dich klar für **eine** Spezifikation: entweder *ein* String (genau das k‑häufigste Wort) **oder** ein Array/List mit den *k häufigsten Wörtern*; implementiere dann genau diese Bedeutung (nicht “alle Wörter mit Häufigkeit = k‑te Häufigkeit”).\n- Statt nur Häufigkeiten zu sammeln, brauchst du für “k häufigste Wörter” eine Struktur, die **Wort + Zähler gemeinsam** betrachtet und sortiert/auswählt (z.B. Entries), damit du wirklich nach Häufigkeit ranken kannst, auch bei gleichen Counts.\n- Überlege dir, was passieren soll, wenn `k` größer ist als die Anzahl unterschiedlicher Wörter (oder wenn noch keine Wörter hinzugefügt wurden) und stelle sicher, dass deine Methode dann nicht durch Listen-Zugriffe crasht.\n\n### Code Style\n- `words` sollte `private` sein (Kapselung), idealerweise auch `final`.\n- Benenne Variablen aussagekräftiger (`x`, `y`, `number` in unterschiedlichen Kontexten machen das Lesen unnötig schwer).\n- `topWordK(int k)` sollte konsistent zum restlichen API-Design sein: entweder ebenfalls `public` und mit JavaDoc/Kommentar kurz erklären, was genau zurückkommt.\n- In `topWordK` ist die Logik schwer nachzuvollziehen, weil du erst Häufigkeiten sammelst und danach wieder Wörter suchst; eine einheitliche Datenrepräsentation (Entry/Pair) würde das klarer machen.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.buyTicket` prüfst du nicht, dass **genau 6 Zahlen übergeben** wurden (z.B. `numbers.length != 6`). Wenn ein Array mit 5 oder 7 Elementen kommt, fällt das bei dir nur indirekt/zufällig auf (über die Set-Size), und das ist nicht gleichwertig zur Anforderung „genau 6 Zahlen vorhanden“.\n- In `Lottery.draw` ignorierst du die Instanzvariable `maxNumber`: du ziehst aktuell fest im Bereich `1..42/43` statt `1..maxNumber`. Dadurch funktioniert die Lotterie nicht korrekt, wenn `Lottery` mit einer anderen Maximalzahl erstellt wird.\n\n### Suggestion\n- Für `buyTicket`: Überlege dir, welche drei Bedingungen separat gefordert sind (Anzahl Elemente, Wertebereich, alle verschieden) und wie du die **Anzahl Elemente** prüfst, bevor du überhaupt mit Set/Range-Checks arbeitest.\n- Für `draw`: Nutze beim Generieren der Zufallszahlen konsequent `maxNumber` (und denke daran, dass `nextInt(...)` je nach verwendeter Variante unterschiedliche Grenzen hat). Teste gedanklich kurz den Fall `new Lottery(10)`.\n\n### Code Style\n- In `Lottery` ist der Import `ch.fhnw.prog1.exercise.lotto.LotteryApp;` unbenutzt und sollte entfernt werden.\n- In `Ticket` könnte `numbers` als `final` deklariert werden, da du die Referenz nach dem Konstruktor nicht mehr neu setzt; das macht die Unveränderlichkeit klarer.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawNoDuplicates()",
"status" : "FAILED",
"message" : "expected: <true> but was: <false>"
}, {
"name" : "drawRandom()",
"status" : "FAILED",
"message" : "expected: <true> but was: <false>"
}, {
"name" : "drawAlreadyDrawn()",
"status" : "PASSED",
"message" : null
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "PASSED",
"message" : null
} ]
}
}