AutoFeedback API

Result 1e992663-1d28-4c26-a8bd-8f3e83d5f38d

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- Deine `add`-Methode speichert die gezählten Wörter nicht dauerhaft im `WordCounter`-Objekt: Du erstellst bei jedem Aufruf ein neues `Map<String, Integer> map` innerhalb von `add`, wodurch die Zählung nach dem Methodenende wieder verloren geht.\n- `add` zählt aktuell nicht “nach und nach die Wörter eines Textes”, weil du das übergebene `word` nochmals mit `split(\" \")` zerlegst (im gegebenen `TextAnalyzer` kommt aber bereits jeweils **ein** Wort/Token pro `add`-Aufruf an).\n- `topWord()` ist nicht implementiert und gibt immer `\"\"` zurück, erfüllt also die Anforderung nicht, das häufigste Wort zu liefern.\n\n### Suggestion\n- Überlege, welche Datenstruktur als **Feld** in der Klasse liegen muss, damit sie über mehrere `add`-Aufrufe hinweg die Häufigkeiten behält (statt sie in `add` neu anzulegen).\n- Schau dir an, wie `TextAnalyzer` `add(part)` aufruft: `part` ist bereits ein einzelnes Wort. Prüfe daher, ob du in `add` überhaupt noch splitten musst oder ob du direkt den Zähler für genau diesen String erhöhst.\n- Für `topWord()` brauchst du eine Möglichkeit, über alle gespeicherten Wort→Anzahl-Paare zu iterieren und dir das Wort mit dem aktuell größten Zähler zu merken.\n\n### Code Style\n- Unbenutzte Imports: `TreeMap` wird nicht verwendet; `Map` ist nur nötig, wenn du es als Typ wirklich brauchst (aktuell könntest du auch direkt mit `HashMap` arbeiten).\n- Debug-Ausgabe (`if(map.containsValue(2)) { System.out.println(map); }`) gehört nicht in die finale `add`-Implementierung, weil sie unerwartete Konsolenausgaben erzeugt.\n- `String[] arr = word.split(\" \");` wirkt hier verwirrend, weil `word` vom Aufrufer schon “ein Wort” ist; das erschwert das Verständnis deines Codes.\n\n\n# Exercise: lotto\n\n### Correctness\n- `Lottery.buyTicket` ist nicht implementiert und gibt immer `null` zurück; damit werden keine Tickets erstellt, keine IDs vergeben und keine Validierungen (6 Zahlen, Bereich 1..maxNumber, alle verschieden, Zustand “vor Ziehung”) durchgeführt.\n- `Lottery.draw` ist nicht implementiert; es werden keine 6 zufälligen *verschiedenen* Gewinnzahlen gezogen/gespeichert und die Zustandsregel (“nur einmal draw()”) wird nicht umgesetzt.\n- In `Ticket` fehlt die Speicherung der Ticket-Zahlen (keine Instanzvariable dafür, Konstruktor unvollständig).\n- `Ticket.getNumbers` ist nicht implementiert und gibt `null` zurück; damit funktionieren Ausgabe/Tests nicht und es wird auch keine Kopie zurückgegeben.\n- `Ticket.getCorrectNumbers` ist nicht implementiert; außerdem fehlt damit auch die geforderte IllegalStateException vor der Ziehung.\n- `Ticket.getPrize` ist nicht implementiert; die Gewinnlogik (0→0, 1→5, danach jeweils *20) sowie die IllegalStateException vor der Ziehung fehlen.\n\n### Suggestion\n- Starte bei `buyTicket` mit der Zustandsprüfung: überlege, woran du erkennst, ob bereits gezogen wurde, und wirf dann die passende Exception.\n- Baue danach die Validierung der Eingabezahlen schrittweise auf: erst Länge genau 6 prüfen, dann Bereichscheck pro Zahl, und für “alle verschieden” eignet sich eine Collection, die Duplikate automatisch verhindert.\n- Vergiss in `buyTicket` nicht, den Ticket-Zähler so zu aktualisieren, dass das erste Ticket ID 1 bekommt (und danach aufsteigend).\n- In `draw` brauchst du eine Schleife, die so lange Zufallszahlen erzeugt, bis du 6 *verschiedene* gesammelt hast; speichere das Ergebnis so, dass `hasDrawn()` danach “true” ist.\n- In `Ticket` entscheide dich für eine Collection zum Speichern der 6 Zahlen, und speichere im Konstruktor die übergebenen Zahlen dort hinein (nicht nur das Array referenzieren).\n- `getNumbers` sollte eine *Kopie* der intern gespeicherten Zahlen liefern (damit Client-Code das Ticket nicht “mutieren” kann).\n- `getCorrectNumbers`: nutze die Gewinnzahlen aus der `lottery`-Referenz und bilde die Schnittmenge mit den Ticketzahlen; denk daran, dass der Aufruf vor der Ziehung eine IllegalStateException auslösen soll (das passiert praktisch automatisch, wenn du intern `lottery.getWinningNumbers()` verwendest und diese Methode schon korrekt wirft).\n- `getPrize`: leite den Gewinn ausschließlich aus der Anzahl korrekter Zahlen ab; überlege dir eine einfache Iteration oder Potenz-/Multiplikationslogik, die bei 1 korrekt mit dem Basisgewinn startet und dann pro weiterer korrekter Zahl mit 20 multipliziert.\n\n### Code Style\n- Viele Methoden enthalten noch `// TODO` und Rückgaben wie `null`/`0`; solange das so ist, führt das schnell zu `NullPointerException` in `toString()`/App-Ausgabe—besser erst implementieren und dann ggf. Tests laufen lassen.\n- In den JavaDocs von `Ticket.getNumbers` steht “als ArrayList”, die Signatur liefert aber `Integer[]`; achte darauf, dass Kommentar und Code zusammenpassen (Kommentar anpassen oder konsequent die geforderte Rückgabeform beibehalten).\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "buyTicketIds()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "buyTicketsIllegalNumbers()",
      "status" : "FAILED",
      "message" : "Connection refused to host: 172.25.0.18; nested exception is: \n\tjava.net.ConnectException: Connection refused"
    }, {
      "name" : "draw()",
      "status" : "FAILED",
      "message" : "expected: <true> but was: <false>"
    }, {
      "name" : "drawNoDuplicates()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawRandom()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawAlreadyDrawn()",
      "status" : "FAILED",
      "message" : "Expected java.lang.IllegalStateException to be thrown, but nothing was thrown."
    }, {
      "name" : "getWinningNumbersNotDrawnYet()",
      "status" : "FAILED",
      "message" : "Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.reflect.UndeclaredThrowableException>"
    }, {
      "name" : "buyTicketAlreadyDrawn()",
      "status" : "FAILED",
      "message" : null
    } ]
  }
}