AutoFeedback API

Result 27cd2aab-374e-42b7-9a59-653c150e006c

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWordK(int k)` erfüllt die Zusatzanforderung nicht zuverlässig: Du verwaltest nur **Zahlen (Häufigkeiten)** und nicht die **Wörter + Häufigkeiten als Paar**. Dadurch bekommst du am Ende nur alle Wörter mit der *k*-ten Häufigkeit, aber nicht zwingend die **k häufigsten Wörter** (Top‑k).\n- In `topWordK(int k)` kann es zu einem Laufzeitfehler kommen: Du rufst `list.getLast()` auf, auch wenn `list` noch leer sein kann (z.B. am Anfang der Schleife oder wenn `words` leer ist).\n- `topWordK(int k)` kann ebenfalls fehlschlagen, wenn es weniger als `k` unterschiedliche passende Häufigkeiten gibt: Dann ist `list` am Ende evtl. kleiner als `k`, aber du verwendest trotzdem `getLast()` als ob alles vorhanden wäre.\n- `topWordK(int k)` nutzt `!list.contains(number)` und verwirft damit doppelte Häufigkeiten. Wenn mehrere Wörter gleich häufig sind, verzerrt das die Auswahl der “Top‑k”, weil du dann weniger als k Kandidaten berücksichtigst (und die *k*-te Position nicht sauber definiert ist).\n- In `TextAnalyzer` nutzt du `counter.topWordK(3)`, aber in der Aufgabenbeschreibung ist die Zusatzfunktion als `public String topWordK(int k)` (ein Wort) oder “Array mit k häufigsten Wörtern” beschrieben. Deine Signatur ist weder `public` noch entspricht sie der Ein-Wort-Variante.\n\n### Suggestion\n- Überlege für `topWordK`, ob du statt einer Liste von **Häufigkeiten** eine Struktur brauchst, die **Wort und Zählung zusammen** speichert (z.B. Einträge aus der Map), damit du wirklich “die häufigsten Wörter” auswählen kannst.\n- Prüfe an den Stellen mit `getLast()`, ob die Liste wirklich schon Elemente enthält, bevor du darauf zugreifst; besonders bei leeren Inputs oder wenn `k` größer ist als die Anzahl Kandidaten.\n- Entscheide dich klar für eine der beiden Varianten aus der Zusatzaufgabe: entweder **genau ein String** (k‑häufigstes Wort) oder **genau k Wörter**. Richte dann Rückgabewert und Ausgabe in `TextAnalyzer` konsistent danach aus.\n- Wenn mehrere Wörter dieselbe Häufigkeit haben: Kläre für dich, wie du das behandeln willst (die Aufgabe erlaubt bei Gleichstand “einfach eines”, aber für Top‑k musst du trotzdem eine konsistente Auswahl treffen).\n\n### Code Style\n- `words` sollte `private` sein (Kapselung), nicht package-private.\n- `topWordK(int k)` sollte (falls vorgesehen) `public` sein, damit es wie die anderen Methoden von außen nutzbar ist.\n- In `TextAnalyzer`: `\"The 3st most frequent words\"` ist sprachlich/inhaltlich schief (und “3st” ist ein Tippfehler). Außerdem passt “most frequent words” nicht zu deiner tatsächlichen Logik (du gibst evtl. mehrere Wörter mit derselben Häufigkeit aus, nicht zwingend “die Top 3”).\n- Variablennamen wie `x`, `y` sind wenig aussagekräftig; lesbarer wäre etwas wie `maxCount`, `candidateWord` etc.\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.buyTicket` prüfst du nicht, dass **genau 6 Zahlen übergeben wurden** (`numbers.length == 6`). Wenn z.B. 5 oder 7 Zahlen kommen, läuft dein Code trotzdem weiter (und kann sogar Tickets verkaufen), obwohl die Aufgabe das explizit verbietet.\n\n### Suggestion\n- Ergänze in `buyTicket` **als eigenen, frühen Check** eine Prüfung der Array-Länge, bevor du über die Zahlen iterierst oder ein `HashSet` baust. Überlege dir dabei auch, welche Exception-Art laut Aufgabenstellung in diesem Fall geworfen werden soll.\n\n### Code Style\n- In `Lottery` ist `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 zuweist (macht die Unveränderlichkeit klarer).\n- In `getPrize` verwendest du die Magic Numbers `5` und `20` direkt; konsistenter wäre es, die vorhandenen Konstanten `Lottery.BASE_PRIZE` und `Lottery.MULTIPLIER` zu nutzen (reduziert Duplikation).\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" : "PASSED",
      "message" : null
    }, {
      "name" : "drawRandom()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "drawAlreadyDrawn()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "getWinningNumbersNotDrawnYet()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "buyTicketAlreadyDrawn()",
      "status" : "PASSED",
      "message" : null
    } ]
  }
}