Methoden Was passiert in den markierten Zeilen?

Reykja

Aktives Mitglied
Ich versteh nämlich nicht ganz warum nach jedem Durchlauf das vorderste Zeichen des Strings gelöscht wird.
String "text" = 3Hallo4

Java:
 private static String duplicateNumbersInString(String text) {
        String dublicate = "";
        if (text.length() >= 1) {                                                   
            if (text.charAt(0) >= '0' && text.charAt(0) <= '9')
                return text.charAt(0) + duplicateNumbersInString(text.substring(1));            //<---- hier
             else
                dublicate = text.charAt(0) + duplicateNumbersInString(text.substring(1));    //<---- hier
        }
        return dublicate;
    }
 

Reykja

Aktives Mitglied
duplicateNumbersInString("3Hallo4") ergibt bei mir als Ergebnis immer noch unverändert "3Hallo4".
Ich habe vergessen zu erwähnen, dass ich mir die einzelnen Schritte mit dem Debugger angesehen habe. Wenn der komplette String durchlaufen wird verschwindet nach jedem Durchgang das vorderste Zeichen bis der String bei "" angekommen ist. Anschließend wird der String wieder von rechts nach links erzeugt, weswegen letztendlich das Ergebnis unverändert bleibt. Mir ist nur nicht klar, warum das passiert.

Aber um zu meiner eigentlichen Frage zurückzukommen - Was passiert in den beiden markierten Zeilen?
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Zuerst musst du eventuell Rekursion verstehen. Du zerteilst ein Problem in ein kleineres oder mehrere kleinere Teilprobleme des gleichen Typs und kannst dann das Ergebnis eines Teilproblems mit dem anderen Teilproblem(en) zum Ergebnis des eigentlichen Problems zusammenführen.

In deinem Fall vermute ich soll aus "1a2B" --> "11a22B" werden, das indiziert jedenfalls der Name der Methode.

In einem Rekursionsschritt nimmst du das erste Zeichen Weg (hier: 1. Schritt ist '1') und löst das gleiche Problem für "a2B". Das Teilproblem "a2B" löst sich nach weiteren Rekursionsschritten als "a22B" auf. "a2B" wird durch die Substring Methode an die weiteren Rekursionsschritte übergeben. Das andere Teilproblem '1' kannst du direkt lösen. Entweder '1' wird zu "11" oder es wird nicht verdoppelt, z.B. bei 'a'. Die Rekursionsschritte sind zu Ende, wenn du keine weiteren Teilprobleme finden kannst. Das Ergebnis beider Teilprobleme "11" und "a22B" fügst du als Ergebnis des Rekursionsschrittes zu "11a22B" zusammen.

Bitte beachte, dass diese Erklärung nicht zu deinem Code passt, denn die Verdopplung findet bei dir aktuell nicht statt.
 

MoxxiManagarm

Top Contributor
Eventuell ist diese Variante des Codes für dich verständlicher

Java:
private static String duplicateNumbersInString(String text) {
  // Rekursiv lösbares Teilproblem
  String teilproblem = text.length > 1
    ? duplicateNumbersInString(text.substring(1)) // rekursiver Aufruf, löst Teilproblem
    : "";  // Abbruchbedingung, es kann kein rekursiv lösbares Teilproblem mehr definiert werden

  // direkt lösbares Teilproblem
  char erstesZeichen = text.charAt(0);

  // Zusammenführen der Teilprobleme
  if (Character.isDigit(erstesZeichen)) {
    teilproblem = erstesZeichen + teilproblem;
  }
  return erstesZeichen + teilproblem;
}
 
Zuletzt bearbeitet:

Reykja

Aktives Mitglied
Du zerteilst ein Problem in ein kleineres oder mehrere Kleine Probleme des gleichen Typs und kannst dann das Ergebnis eines Teilproblems mit dem anderen Teilproblem zum Ergebnis des Problems zusammenführen.
klingt nach "divide et impera" :)
n deinem Fall vermute ich soll aus "1a2B" --> "11a22B" werden, das indiziert jedenfalls der Name der Methode.
Java:
  private static String duplicateNumbersInString(String text) {
        String duplicate = "";
        if (text.length() == 0)
            return text;
            if (text.charAt(0) >= '0' && text.charAt(0) <= '9') {
                return text.charAt(0) + duplicate + text.charAt(0) + duplicateNumbersInString(text.substring(1));
            } else {
                return text.charAt(0) + duplicateNumbersInString(text.substring(1));
    }
}
Ja genau, hab den Code jetzt auch modifiziert!
Und danke für deine Erklärung!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
S ExecutorService.invokeAll -- was passiert wenn einige Tasks schon ausgefuehrt wurden? Allgemeine Java-Themen 2
B notify() - was passiert danach genau? Allgemeine Java-Themen 8
F Was Passiert bei einem externen Programmaufruf Allgemeine Java-Themen 4
S was passiert bei diesem filereader prozess Allgemeine Java-Themen 2
M Thread: was passiert nach run()? Allgemeine Java-Themen 12
A Was passiert hier? Allgemeine Java-Themen 13
D markierten Text kopieren Allgemeine Java-Themen 2
W Auf markierten Text zugreifen? Allgemeine Java-Themen 5
E markierten text im windowsprogramm an javaprog. übergeben? Allgemeine Java-Themen 9
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
R Spalten/Zeilen verschieben in zweidimensionalen Arrays? Allgemeine Java-Themen 3
Joker4632 Klassen Buffered Reader liest die Leerzeichen am Zeilen Ende nicht mehr Allgemeine Java-Themen 2
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
C Zeilen-"Vektor" aus Excel-Tabelle suchen Allgemeine Java-Themen 0
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
KaffeeFan FileWriter nur leere Zeilen beschreiben Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
M Zeilen zu einem DefaultTableModel hinzufügen Allgemeine Java-Themen 1
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
Todesbote Zeilen aus Excel in andere Excel Tabelle kopieren Allgemeine Java-Themen 0
I JTextArea soll nur drei Zeilen anzeigen Allgemeine Java-Themen 1
Java-Insel Zeilen im Terminalfenster unsichtbar machen Allgemeine Java-Themen 9
127.0.0.1 Zeilen in .txt Datei löschen Allgemeine Java-Themen 11
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
L jTable drag & drop einzelner Zeilen Allgemeine Java-Themen 4
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
C Zeilen/Spaltenzahl Allgemeine Java-Themen 7
X Textdatei auf gewünschte Anzahl der Zeilen kürzen Allgemeine Java-Themen 2
B Problem mit leeren Zeilen Allgemeine Java-Themen 2
B Textdatei Zeilen auslesen Allgemeine Java-Themen 7
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
K Textdatei komplett auslesen bis auf 2 Zeilen Allgemeine Java-Themen 2
S Zeilen in einer Datei löschen Allgemeine Java-Themen 3
A Zeilen aus einer Textdatei löschen Allgemeine Java-Themen 6
MQue 16 Fehler pro 1000 Zeilen Allgemeine Java-Themen 11
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
G 2 zeilen in textdatei beim auslesen verbinden Allgemeine Java-Themen 10
MQue Zeilen nach rechts verschieben Allgemeine Java-Themen 3
B Entfernen von Zeilen/Spalten aus einer Matrix Allgemeine Java-Themen 8
G einzelne zeilen aus textArea auslesen Allgemeine Java-Themen 8
T Zeilen eines Projekts zählen lassen Allgemeine Java-Themen 14
P Kompletten Textseiten in gleich lange zeilen schneiden Allgemeine Java-Themen 7
L In JTable Zeilen n. selben Dateninhalt filtern & ausgebe Allgemeine Java-Themen 16
S FileReader Methode nach Zeilen. Allgemeine Java-Themen 2
R Daten in File schreiben (mit Zeilen beachten) Allgemeine Java-Themen 12
V Zeilen lesen Allgemeine Java-Themen 3
V Anzahl der Zeilen in einem File Allgemeine Java-Themen 3
thE_29 Größe bzw. Zeilen einer Datei Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben