Rekursive String Methode, Gerade Zahlen rausfiltern

macle

Mitglied
Hey,
ich bin jetzt schon lange am verzweifeln und weiß nicht genau was ich tu soll.
Die Aufgabe lautet:

Rekursive Methode gibGeradeZahlen(String s) schreiben; es ist ein String aus Zahlen gegeben, von welchem nur die geraden Zahlen zurückgegeben werden soll.

Wäre es kein String, und wenn ich Schleifen benutzen dürfte, mit einer Aktualisierungsanweisung, wäre das einfacher, aber das darf ich nicht anwenden.

Meine Idee war:

Java:
int laenge = s.length();

return s.length() == 1
 ? s.charAt(0) % 2 == 0
  ? s
  : ""
 : s.charAt(laenge - 1) % 2 == 0
  ? gibGeradeZahlen( string mit letzter ziffer entfernt ) + s.charAt(...)
  : gibGeradeZahlen( string mit letzter ziffer entfernt );

Am Ende habe ich Schwierigkeiten, ich weiß nicht wie ich den String mit einer Stelle weniger nochmal durchgebe

Hoffe auf eine baldige Antwort, vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Auch in einer rekursiven Funktion darfst du normale ifs benutzten, du musst das nicht mit dem ternären Operator machen 🙂

Zu deiner Frage: mal in die Doku zu String geguckt? Da finden sich Methode, die nur einen Teil des Strings (engl. etwa „substring“) zurück geben
 
Auch in einer rekursiven Funktion darfst du normale ifs benutzten, du musst das nicht mit dem ternären Operator machen 🙂

Zu deiner Frage: mal in die Doku zu String geguckt? Da finden sich Methode, die nur einen Teil des Strings (engl. etwa „substring“) zurück geben
Mit substring habe ich schon rumprobiert, da lässt sich ja einfach die letzte Stelle entfernen mit s.substring(0, s.length()-1). Soll ich dann einfach eine Aktualisierungsanweisung machen, int i = 1 und diese in s.substring(0, s.length()-i) einsetzen?! Könnte funktionieren oder gibt es eine Alternative?
 
Was zur Hölle ist eine Aktualisierungsanweisung?


Warum das i? Schreib doch einfach direkt die 1 dahin.
Eben eine Variable die sich immer erhöht, aber egal.

So hatte ich das auch am Anfang stehen aber da kamen nur Errors raus.
Ich hab es jetzt aber gelöst, vielen Dank!

Java:
public static String gibGeradeZahlen(String s){
        
        int laenge = s.length();
        
        return s.length() == 1
                ? s.charAt(0) % 2 == 0
                    ? s
                    : ""
                : s.charAt(laenge - 1) % 2 == 0
                    ? gibGeradeZahlen(s.substring(0, laenge - 1)) + s.charAt(laenge -1)
                    : gibGeradeZahlen(s.substring(0, laenge - 1));
        
    }
 
Bei so etwas bitte immer ein Beispiel angeben. Und hier geht es ja um Ziffern und es geht nicht um Zahlen...
Java:
    public static boolean isEven(char c) {
        return Character.getNumericValue(c) % 2 == 0;
    }

    public static String gibGeradeZiffern(String s) {
        int l = s.length();
        return l == 0 ? "" : isEven(s.charAt(0)) ? s.charAt(0) + gibGeradeZiffern(s.substring(1)) : gibGeradeZiffern(s.substring(1));
    }

    public static void main(String[] args) {
        System.out.println(gibGeradeZiffern("9012345678909"));
    }
 
Wenn da jetzt sogar schon eine Lösung genannt wurde, dann will ich da einmal kurz ansetzen und meinen Senf dazu geben:

Verschachtelte Ternäre Operationen sind aus meiner Sicht schwer lesbar. Des Weiteren finde ich bei Rekursionen immer schön, wenn die Abbruchbedingung gut zu erkennen ist. Das würde dann den Code leicht verändern:

Java:
    public static boolean isEven(char c) {
        return Character.getNumericValue(c) % 2 == 0;
    }

    public static String gibGeradeZiffern(String text) {
        if (text.length() == 0) return "";
        return isEven(text.charAt(0)) ? text.charAt(0) + gibGeradeZiffern(text.substring(1)) : gibGeradeZiffern(text.substring(1));
    }

    public static void main(String[] args) {
        System.out.println(gibGeradeZiffern("9012345678909"));
    }

Und ich würde sogar eher noch eine Methode hinzufügen, die einen char nimmt und bei gerader Ziffer diese als String zurück gibt und sonst nur einen leeren String. Dann wäre der ternäre Operator da auch weg und man hätte etwas wie:
Java:
return filterNonEvenChars(text.charAt(0)) + gibGeradeZiffer(text.subString(1));
(Die Namen müsste man sich ggf. noch überlegen ...)
 
Vielleicht ist auch das besser verständlich
Java:
    public static boolean isEven(char c) {
        return Character.getNumericValue(c) % 2 == 0;
    }

    public static String gibGeradeZiffern(String s) {
        int l = s.length();
        if (l > 0) {
            char first = s.charAt(0);
            boolean even = isEven(first);
            String rest = gibGeradeZiffern(s.substring(1));
            return even ? first + rest : rest;
        } else {
            return "";
        }
    }
Oder das (wie es JustNobody bereits vorgeschlagen hat...)
Java:
    public static boolean isEven(char c) {
        return Character.getNumericValue(c) % 2 == 0;
    }

    public static Optional<String> filterIsEven(String s) {
        if (s.isEmpty() || !isEven(s.charAt(0))) {
            return Optional.empty();
        }
        return Optional.of(String.valueOf(s.charAt(0)));
    }

    public static String gibGeradeZiffern(String s) {
        return s.length() == 0 ? "" : filterIsEven(s).orElse("") + gibGeradeZiffern(s.substring(1));
    }
 

Zurück
Oben