Hallo, ich habe ein paar Fragen zu einer meiner Übungsaufgaben und hoffe ihr könnt mir vielleicht weiterhelfen!
Und zwar ist die Aufgabe eine Klasse zu schreiben die über die Standareingabe einen Strig bekommt, welcher Zahlen und auch Buchstaben enthalten kann, allerdings keine Leerzeichen, Satzzeichen oder Umlaute vorkommen. Mein Programm soll genau einen String auf der Standardausgabe anzeigen und dabei soll die Zahl durch die Anzahl des nachfolgenden Buchstabens ersetzt werden, also so oft geschrieben werden wie die Zahl. Bsp: 3bz2u wäre dann bbbzuu.
Hier weiß ich leider gar nicht weiter, weil ich auch keinen weg kenne wie man quasi alle zahlen mit einbinden kann. Ich denke mal man muss dazu amm besten ein Array nutzen und mit der replace-methode arbeiten, aber ansonsten hab ich echt keinen plan :/
Du kannst dir den String als CharSequence geben lassen, also quasi als Array
Dann gehst du jedes Zeichen bis zum Ende durch und schaust ob das aktuelle Zeichen eine Zahl ist.
Wenn es eine Zahl ist, schaust du zusätzlich das nächste Zeichen an (hoffentlich ist das dann ein Buchstabe). Diesen Buchstaben schreibst du dann sooft in einen neuen String wie es die Zahl vorgibt.... und dann das ganze von vorn
Eine Frage: in welchem Zahlenbereich sollen die Zahlen sein? 1-9? oder einfach alle natürlichen Zahlen?
Damit kannst du dir ein Patter definieren, alá
- beliebig viele Ziffern (\d+), gefolgt von beliebig vielen Buchstaben (\D+)
Damit bekommst du alle Paare von Zeichenketten die zu replizieren sollst.
Für jedes Paar musst du nun noch die Anzahl und die Zeichenkette selbst extrahieren.
Das kannst du wieder über die beiden oben genannten Patterns machen, nun aber halt einzeln,
also: Anzahl, wie oft du die Zeichenkette aneinanderhängen musst, bekommst du wenn du als Pattern (\d+) verwendest, welche Zeichenkette du replizieren sollst über (\D+)
Kann es sein dass du da was falsch verstanden hast. sie müsste doch nach einer Ziffer gefolgt von einem Buchstaben suchen. Oder wie meinst du das mit deinem "Zeichenketten replizieren" ?
Ich glaube die Idee ist richtig, der Ansatz in Java aber komplizierter.
Man kann durch "(?<=[0-9]+)\\D" alle Buchstaben herausfilter, die einer Zahl folgen.
Dann muss man aber noch die Zahlen filtern. Oder man benutzt den oben genannten regex und filtert sich alle Zahlen-Buchstaben Paare (also sowas wie 9d, 42a, 99999x). Hier muss man dann den gefundenen Token nochmal in Zahl und dazugehörigen Buchstaben splitten.
Der Rest sollte dann einfach sein.
aso, in dem Fall könnte man, um bei obiger Logik zu bleiben bleiben, die Buchstabenfolge mittels der substring Methode in einen zu replizierenden Teil (nur erster Buchstabe) und einen einfach anzuhängenden Teil (alle übrigen) trennen.
Nach dem Urlaub endlich mal ein wenig Zeit Threads aufzuarbeiten.
Also hier sind Regex doch wirklich ein kleiner Overkill?! Einfach über den String iterieren und einen Zustand überwachen:
Java:
publicstaticStringunfold(String s){StringBuilder builder =newStringBuilder();for(int i =0, num =0; i < s.length(); i++){char c = s.charAt(i);if(Character.isDigit(c)){
num = num *10+Character.digit(c,10);}elseif(num !=0){for(int j =0; j < num; j++){
builder.append(c);}
num =0;}else{
builder.append(c);}}return builder.toString();}