tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
399
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    Hallo,

    habe folgendes Problem. Ich soll in einer Aufgabe eine rekursive Methode schreiben, die einen String entgegen nimmt und ihn dann umgekehrt wieder ausgibt. Es gilt außerdem noch, das man nur den +-Operator auf Strings sowei die beiden Methoden charAt() und length() verwenden darf. Hier ist mal mein Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    public class StringRekursion {
        
       public static void ausgeben(String st)
    {
    int length = st.length();
    if (length > 0)
    {
        //System.out.print(st.charAt(0));
        ausgeben (st.substring(1, length));
       System.out.print(st.charAt(0));
    }
    }
     
       public static void main(String args[])
       {
       
         StringRekursion str = new StringRekursion();
         str.ausgeben("Hallo");
         
         
       }
    }

    Wie ihr seht habe ich hier noch die substring()-Methode eingebaut, da ich nicht weiss wie ich das anders lösen soll. Kann mir jemand helfen?
     

  2. #2
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Du verwendest eine rekursive Methode. Nur wenn du das schon so machst, dann frag ich mich, warum du anstatt den String von hinten nach vorn auszugeben lieber den String solange von vorne abschneidest, bis du den String auf 0 gekürzt hast. Lass den String doch von hinten nach vorne ausgeben, dann brauchst du auch kein substring().

    EDIT:
    So als Tipp: Du müsstest die Methode etwas abändern, und zwar brauchst du noch einen Parameter (pos) für die Position des "Zeigers". Beim ersten Aufruf ist pos = length-1 und wird bei jedem Aufruf immer um 1 subtrachiert bis pos == 0 ist.
    Geändert von Akeshihiro (29.07.11 um 12:02 Uhr)
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  3. #3
    Maddin Maddin ist offline Mitglied Silber
    Registriert seit
    Jul 2010
    Beiträge
    71
    Hi,

    Ich hätt das auch eher anders gemacht...
    Immer den letzten Buchstaben ausgeben und dann davor. Das geht mit Rekursion ja recht einfach.
    Kleiner Tipp: Mit Zähler so lange durchlaufen, bis der Zähler am letzten Buchstaben angekommen ist. (So hab ich's zumindest gemacht)

    Gruß,
    Martin

    Edit: Akeshihiro war schneller.
     

  4. #4
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    Hmm also ich glaube ich habe im Moment einfach ein Brett vorm Kopf. Ich muss der ausgeben-Methode doch den gekürzten String übergeben richtig, aber wenn ich das mit der charAt-Methode versuche bekomme ich ne Fehlermeldung. Danke trotzdem schonmal
     

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Nein, du musst keinen gekürzten String übergeben, sondern das Original und einen Zahlenwert für die Position, die der nächste Methoden-Aufruf verwenden soll, um quasi das vorherige Zeichen zu verwenden. Das heißt die Zahl wird immer kleiner.

    Hier mal die neue Methodensignatur:
    Code java:
    1
    
    public static void rueckwertsAusgeben(String str, int pos) {}

    Ein Beispielaufruf könnte dann so aussehen:
    Code java:
    1
    2
    
    String blub = "hallo und so";
    rueckwertsAusgeben(blub, blub.length()-1);

    So, in rueckwertsAusgeben (oder von mir aus auch einfach ausgeben, falls du das so lassen willst), musst du jetzt einfach das Zeichen an der Position, die die Methode bekommen hat, ausgeben und dann rufst du die Methode ein weiteres Mal auf, aber für die Position übergibst du dann pos-1. Natürlich musst du auch eine Abbruchbedingung haben. Dabei kommt es drauf an, wie du es lieber machen würdest. Ich persönlich prüfer lieber zuerst alle Parameter und wenn was nicht stimmt, dann wird auch nicht forgefahren. In dem Fall hieße das, dass sobal pos == -1 ist, einfach ein return stattfindet. Oder du prüfst vor dem rekursiven Aufruf, ob pos == 0 ist, denn das hieße, dass du bereits das erste Zeichen ausgegeben hast und somit fertig bist. also wenn pos > 0, dann Methode aufrufen, sonst nicht.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  6. #6
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    Danke das ist schon mal ein guter Tipp allerdings befürchte ich das ich die ausgeben-Methode nicht um einen int-Parameter erweitern darf sondern das nur ein String übergeben werden darf aber ich werd mich da am wochenende nochmal umhören
     

  7. #7
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Warum darfst du das nicht? Ist die so vorgegeben worden?

    EDIT:
    Wenn die Methode die Signatur haben soll, die du oben gepostet hast und du kein substring() verwenden darfst, dann fällt mir nur eine Möglichkeit ein. Du müsstest dann mit einer Schleife einen temporären String generieren und den dann als Parameter übergeben. Aber ob die Lösung so toll ist, wage ich bezweifeln.
    Geändert von Akeshihiro (29.07.11 um 13:11 Uhr)
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  8. #8
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    Ja genau das ist ja mein Problem, es ist so vorgegeben aber wie kann ich einen temporären String realisieren?
     

  9. #9
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    Hallo,

    hast du schon an folgendes gedacht oder wie ist das mit den Konventionen?


    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    public class MainExample
    {
        public static void main(String[] args) 
        {
            String strTemp = "Hallo";
            new MainExample().recursiveMethod(strTemp);
        }
        
        private void recursiveMethod(String str)
        {
            if(str.length() > 1)
            {
                int i = str.length() - 1;
                while(i >= 0)
                {
                    this.recursiveMethod(String.valueOf(str.charAt(i)));
                    i--;
                }
            }
            else
            {
                System.out.print(str);
            }
        }
    }


    Viele Grüße...
     
    „Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
    Georg Christoph Lichtenberg

    Netiquette (vA §15)
    Codetags/Codeboxen
    Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D

  10. #10
    Dude Dude ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    11
    Ich hab mir das mal fix angeschaut
    Falls du nur die Methoden verwenden darfst und die Sache mit der If Anweisung auch drin bleiben soll.
    Kannst du wie Akeshihiro schon erwähnt hat, beispielsweise eine Klassen Variable anlegen, in der du dir dann die Zeichen des Strings von hinten her merkst, um diese dann am ende auszugeben.
    Anschließend rufst du rekursiv die Methode mit einen String der um eines kleiner ist als dein Ursprungs String.
    Da du keinen substring verweden darfst leg dir hierfür einfach eine String Variable die du dir mit charAt() zusammensetzt

    Schön ist weiß Gott anders aber es funktioniert

    Dude
     

  11. #11
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Ja genau das ist ja mein Problem, es ist so vorgegeben aber wie kann ich einen temporären String realisieren?
    Eine String-Variable, welche in der rekursiven Methode deklariert und initialisiert wird. Im Prinzip machst du an der Stelle nichts anderen, als dir selbst eine Art substring-Methode zu bauen. Also statt
    Code java:
    1
    
    st.substring(1, length)
    baust du dir eine Schleife, welche beim 2. Zeichen beginnt, bis zum letzten Zeichen durchläuft und die einzelnen Zeichen mittels + zu diesem temporären String zusammensetzt, welchen du dann an der stelle übergibst, wo du vorher substring aufgerufen hast.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  12. #12
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    So bin zurück aus dem WE. Also danke nochmals für eure Kommentare aber ich bekomme es einfach nicht wirklich hin. Wenn ich mir nen String zusammen mbauen will, also z.B. so

    Code :
    1
    
    String result = result.charAt(st.length()-1);

    bekomme ich die Fehlermeldung das Result einen String erwartet und nicht char.
     

  13. #13
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Weil charAt() einen char zurückliefert, du musst also aus dem char erst einen String machen. Das könntest du z.B. auf diese Weise tun:
    Code java:
    1
    
    String result = "" + result.charAt(st.length()-1);
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

Ähnliche Themen

  1. Einen String umdrehen und vergleichen
    Von FaNo86 im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 10.11.09, 07:50
  2. satz umdrehen
    Von v3rst0rk3r im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 11.04.06, 17:27
  3. String umdrehen
    Von Raetsel im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 07.06.05, 12:43
  4. Bilderfolge umdrehen ?
    Von BeaTBoxX im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 21.11.03, 22:48
  5. String umdrehen
    Von ShinmA im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 23.09.03, 13:22