Dies ist eine alte Version des Dokuments!
Tag 3
Hilfestellungen Teil 1
- Fasse die Eingabe als zweidimensionales Arrays auf! Jeder Character hat eine Koordinate, die man mit x und y beschreiben kann. (y beginnt in der Informatik typischerweise links oben → das passt: y=0 ist die erste/oberste Zeile).
- Nutze daher auch NICHT die foreach-Schleife, sondern eine übliche for-Schleife, in der du für jede Zeile y erhöhst. Speichere die aktuelle Zeile am besten in einer Variablen (z. B.
line
). - Prüfe Reihe für Reihe von links nach rechts für jeden Character, ob dieser eine Ziffer ist (
Character.isDigit(line.charAt(x)
) und ob er Symbole als Nachbarn hat. - Die Prüfung der Symbole als Nachbarn lagern wir in eine separate Methode aus, die die x- und y-Koordinate der zu überprüfenden Ziffer entgegennimmt. Prüfe für jede benachbarte Koordinate (dx von x-1 bis x+1 sowie dy von y-1 bis y+1), ob der dortige Character c weder eine Ziffer (siehe vorheriger Punkt) noch ein Punkt (
c != '.'
) ist. Ist es weder das eine, noch das andere, dann kann insgesamt true zurückgegeben werden, da mindestens ein Nachbar ein Symbol ist. - Nun weiß man, dass die Ziffer der aktuellen x- und y-Koordinate Teil einer größeren Zahl ist, die vollständig erfasst werden muss. Auch diese Erfassung der gesamten Zahl anhand einer Ziffern-Koordinate lagern wir wieder in eine separate Methode aus (z. B. getFullNumber(x, y).
- getFullNumber(x, y): Zunächst müssen wir zum Ende der gesamten Zahl gehen - wir werden dann von hinten nach vorne alle Ziffern der Zahl nacheinander erfassen. Da wir auch zu einem späteren Zeitpunkt erneut an das Ende der Zahl müssen, bietet es sich an, auch diesen Punkt in eine separate Methode auszulagern:
- getEndOfNumber(x, y): Solange die x-Koordinate kleiner als die Zeilenlänge ist und der nachfolgende (rechte) Character eine Ziffer ist, solange wird x um eins erhöht. Dann wird x zurückgegeben und gibt die hinterste/rechteste Ziffer der gesuchten Zahl an.
- Jetzt wieder zurück in getFullNumber(x, y): Wir benötigen eine Variable, die zunächst auf die hinterste Ziffer zeigt (
end
). Solang end > 0 und solange der aktuelle Character eine Ziffer ist, solange wird der aktuelle Character c als Zahl aufgefasst (Character.getNumericValue©
) und mit passender Wertigkeit (um Faktor 10 erhöhen pro Stelle) zum Zahlenwert dazuaddiert. Man kann der Reihe nach also z. B. 5*10^0 + 3*10^1 + 7*10^2 rechnen. Die Potenz kann berechnet werden mitMath.pow(10, stelle)
, wobeistelle
anfangs 0 ist und jeweils um 1 erhöht wird. - Die gesamte Zahl ist damit fertig erfasst und wird in die Hauptmethode zurückgegeben und dort zur Gesamtsumme aufaddiert.
- Nun ist es abschließend noch wichtig den aktuellen x Wert an das Ende der aktuellen Zahl zu setzen. Denn andernfalls würde man x nur um 1 erhöhen und für den nächsten Character überprüfen, ob dieser eine Ziffer ist und auch Nachbarn hat. Dabei kann x sich aber noch immer in derselben Zahl befinden, die soeben bereits erfasst wurde. Wir müssen also sicherstellen, dass wir diese Zahl nicht erneut überprüfen. Daher rufen wir nochmal
getEndOfNumber(x, y)
auf und setzen x auf das Ergebnis dieser Methode + 1.