Methoden Was passiert in den markierten Zeilen?

Diskutiere Was passiert in den markierten Zeilen? im Allgemeine Java-Themen Bereich.
R

Reykja

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;
    }
 
R

Reykja

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:
R

Reykja

@temi
charAt(0) zB ist in dem Fall "3"
substring(1) wäre ja "Hallo4" oder?
Und um auf deine Frage zu antworten, der rekursive Aufruf.
 
MoxxiManagarm

MoxxiManagarm

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

MoxxiManagarm

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:
R

Reykja

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!
 
Thema: 

Was passiert in den markierten Zeilen?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben