# Übung mit Stack/StringBuilder



## LP22 (27. Mrz 2016)

Also ich mache momentan eine Übung aus einem Buch und sie lautet folgendermassen:

Der User soll einen Text/Wort eingeben können und bei diesem werden dann die Zeichen vertauscht. abc = cbm. Das Wort soll dann auf einem Stack abgelegt werden.

Ich habe mir gedacht dass ich mit StringBuilder arbeite und da so nicht unzählige String Objekte erzeugt werden.

Hier mal meine Klassendefinition:

In der Methode read() möchte ich dass der User ein Wort eingibt als String und dieser dann als Stringbuilder zurückgeben wird. Beide StringBuilder Objekte "wort" und "reversewort" werden mit setLength(0) gelöscht so dass diese leer sind.

In der zweiten Methode versuche ich dann den Stringbuilder "wort" umzutauschen. Dort bekomme ich dann eine Fehlermeldung dass die variable "endWort" nicht initialisiert ist. Doch diese ist doch mich String = endWort; definiert?;

Der Rest vom Code ist dann die main wo ich versuche Objekte auf dem Stack abzulegen.

Jemand einen Tipp für mich?


```
import java.util.*;


class stack{

    static StringBuilder wort;
    static StringBuilder reverseWort;
   
   
        public static  StringBuilder read(){
            Scanner scan = new Scanner(System.in);
            System.out.println("Bitte Geben Sie ihr Wort/Text ein: ");   
            String eingabe = scan.nextLine();
            wort.setLength(0);
            reverseWort.setLength(0);
            wort.append(eingabe);
            return wort;
        }
       
        public static StringBuilder reverse(){
            String endWort;
            String text = wort.toString();
                for(int i = text.length()-1; i >=0; i--){
                    endWort += text.charAt(i);
                }
            reverseWort.append(endWort);
            return reverseWort;
        }
public static void main(String[] args){
   
    Stack stack = new Stack();
   
    read(); //Lesen von Wort 1
    reverse(); //Umkehren von Wort1
    stack.push(reverseWort);

    while( !stack.empty() ){
                stack.peek();
            }
}
}
```


----------



## mrBrown (27. Mrz 2016)

endWort ist nur deklariert, nicht initialisiert, dh endWort wäre bei endWort += text.charAt(i); noch null, und es gäbe somit eine NPE. Zum initialisieren ginge zb endWort="";.

Die Verwendung von StringBuilder an sich ist sinnvoll, deine Verwendung davon bringt aber nichts 
Der Sinn ist, sowas wie endWort += text.charAt(i); damit zu kapseln, nicht, nur einen String zwischenzuspeichern.
Besser wäre es, wenn read() und reverse() einen String zurückgeben. Intern können die beiden Funktionen dann StringBuilder benutzen.


Was willst du da mit dem Stack machen?


----------



## kneitzel (27. Mrz 2016)

Also die Aufgabe scheinst Du ja bereits gelöst zu haben. Nur eben scheinst Du Deine Ideen nicht so 100% umgesetzt zu haben.

Wenn Du einen String einfach nur speichern willst, dann ist es ok, das in einem String zu machen. Das eingegebene Wort kannst Du also als String speichern. StringBuilder nutzt man aber wirklich, wenn man dann etwas verändern möchte.

Und wenn Du dann den neuen String aufbaust, dann nutzt Du tatsächlich das Verknüpfen von Strings (endwort += ...). Das ist doch eigentlich das, was Du verhindern wolltest.

Statt endwort als String zu haben, wäre hier ein StringBuilder zu verwenden, an den Du dann per append immer das Zeichen anhängst.

Generell hat StringBuilder auch eine reverse Funktion - aber das selbst zu entwickeln war wohl Deine Absicht.

Und ich sehe keinen wirklichen Mehrwert, die eigentlich nur lokal benötigen Variablen auf Instanzebene zu speichern. Daher wäre meine Empfehlung, die als Argumente zu übergeben wo notwendig und die Rückgabewerte der Funktionen zu nutzen.

Also um das etwas zusammen zu fassen einmal der veränderte Code:

```
public static  String read(){
    Scanner scan = new Scanner(System.in);
    System.out.println("Bitte Geben Sie ihr Wort/Text ein: ");
    String eingabe = scan.nextLine();
    return eingabe;
}

public static String reverse(String wort){
    StringBuilder result = new StringBuilder();
    for(int i = wort.length()-1; i >=0; i--){
        result.append(wort.charAt(i));
    }
    return result.toString();
}

public static void main(String[] args) {
    Stack stack = new Stack();

    String inputWort = read(); //Lesen von Wort und speichern in lokaler Variable
    String reverseWort = reverse(inputWort); // Umkehren des Wortes
    stack.push(reverseWort);

    while( !stack.empty() ){
        stack.peek();
    }
```


----------



## LP22 (27. Mrz 2016)

Ah okay.. Danke euch. Werde mir dass dann morgen mal anschauen. Stack ist halt einfach Vorgabe damit man diesen kennenlernt. Ich will nur etwas ablegen, und dann anschauen.

Ja das mit dem StringBuilder habe ich mir gedacht, brauche ich damit ich nicht immer ein neues Stilribg Objekt erzeuge sondern nur ein StringBuilder Objekt habe und halt inmer dieses verwende. Das war meine Überlegung am Anfang


----------



## LP22 (27. Mrz 2016)

kneitzel hat gesagt.:


> .....Also um das etwas zusammen zu fassen einmal der veränderte Code:
> 
> ```
> public static  String read(){
> ...



Ich versuche nun deinen Vorschlag. Kompiliert ohne Probleme doch beim Einlesen scheint er in einer Endlosschleife zu sein? Ich gebe etwas ein + enter und das Terminal springt einfach eine Zeile weiter aber ist immer noch im "Scanner" modus.


----------



## kneitzel (27. Mrz 2016)

Also ich kann keine Endlosschleife entdecken in dem Code, den ich verändert habe. Aber in der main Funktion war ja noch Stack-"Müll", den ich nicht entfernt hatte. Dadurch möchte ich nicht ausschließen, dass es da irgendwelche Dinge gibt, die nicht so laufen, wie von Dir gedacht.

Den Code bezüglich String und reverse String einfach einmal ganz ohne jegliche Stack Teile:

```
import java.util.Scanner;

public class Test  {

    public static  String read(){
        Scanner scan = new Scanner(System.in);
        System.out.println("Bitte Geben Sie ihr Wort/Text ein: ");
        String eingabe = scan.nextLine();
        return eingabe;
    }

    public static String reverse(String wort){
        StringBuilder result = new StringBuilder();
        for(int i = wort.length()-1; i >=0; i--){
            result.append(wort.charAt(i));
        }
        return result.toString();
    }

    public static void main(String[] args) {
        String inputWort = read();
        System.out.println(reverse(inputWort));
        inputWort = read();
        System.out.println(reverse(inputWort));
    }
}
```

Ablauf:

```
"C:\Program Files\Java\jdk1.8.0_71\bin\java" -Didea.launcher.port=7535 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_71\jre\lib\rt.jar;D:\Projects\Java\Tests\out\production\Tests;D:\Projects\Java\Tests\Lib\jave-1.0.2.jar;D:\Projects\Java\Tests\Lib\javax.mail.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain Test
Bitte Geben Sie ihr Wort/Text ein: 
abc
cba
Bitte Geben Sie ihr Wort/Text ein: 
def
fed

Process finished with exit code 0
```


----------

