stringbuffer? etc?
Results 1 to 10 of 10

Thread: stringbuffer? etc?

  1. #1

    Title
    Master
    Join Date
    Apr 2002
    Posts
    146
    Thanks
    0
    Thanked 0 Times in 0 Posts

    stringbuffer? etc?

    ich hab die main methode geändert, den namen der klasse in testen und alle printlns in returns
    wenn ich testen kompeliere bekomme ich folgende compiler meldung: found java.lang.StringBuffer
    required java.lang.String
    was soll ich denn noch ändern

    hier mein testen. java:


    import eprog.*;

    public class Testen extends EprogIO

    { public static String perform()

    { boolean eingabefehler = false, singlemode = true, multimode = false;
    String eingabepuffer = "",hochk="'";
    int i=0,j=0,laenge=0,count=2;
    char zeichen=' ',nextzeichen=' ';
    StringBuffer ausgabepuffer = new StringBuffer();

    {
    eingabepuffer = readWord(); // Einlesen des Wortes
    laenge = eingabepuffer.length();

    if (laenge <= 30); // Laenge der eingabe Pruefen (Eingabe<=30)
    else eingabefehler = true;
    }

    do {
    try {
    zeichen = eingabepuffer.charAt(i++);
    nextzeichen = eingabepuffer.charAt(i);
    }
    catch (IndexOutOfBoundsException e)
    {;}

    if (i == laenge)
    { nextzeichen = ' '; }

    if (zeichen == nextzeichen) // Feststellen welcher Modus verwendet werden muss
    { multimode = true;
    singlemode = false; }
    else { singlemode = true;
    multimode = false; }

    if (singlemode & !eingabefehler) // Beginn und "End" des Singlemode
    { ausgabepuffer.append(zeichen); }

    if (multimode & !eingabefehler) // Beginn des Multimode
    { ausgabepuffer.append(hochk);
    do {
    if (multimode)

    { ausgabepuffer.append(zeichen);
    do {
    try {
    nextzeichen = eingabepuffer.charAt(++i);
    }
    catch (IndexOutOfBoundsException e)
    {;}
    if (i == laenge)
    { nextzeichen = ' '; }

    if (zeichen == nextzeichen) { // Zaehlen der gleichen aufeinanderfolgenden Zeichen
    count++; }
    else {
    if (count > 9)
    { eingabefehler = true; }
    else { ausgabepuffer.append(count);
    count = 2; } }
    }
    while (zeichen == nextzeichen);

    { zeichen = nextzeichen; // Pruefen ob wieder eine gleiche Zeichenreihe folgt
    try {
    nextzeichen = eingabepuffer.charAt(++i);
    }
    catch (IndexOutOfBoundsException e)
    {;}
    if (i == laenge)
    { nextzeichen = ' '; }
    if (zeichen == nextzeichen);
    else multimode = false;
    }
    }
    }
    while (multimode & i < laenge);
    if (i < laenge)
    { ausgabepuffer.append(hochk); }
    if (i <= laenge)
    if (nextzeichen == ' ')
    { ausgabepuffer.append(hochk); }
    if (!multimode)
    { ausgabepuffer.append(zeichen); }
    }

    }
    while (i < laenge); // Ende der Do-While Schleife

    if (eingabefehler)
    { return("FALSCHE EINGABE"); }
    else return(ausgabepuffer);

    }
    }

  2. #2
    DoomedOne
    du musst zuerst schauen was für ein Typ "ausgabepuffer"
    ist. Hier ist es ein StringBuffer und den kannst du nicht zurückgeben wenn ein String erwartet wird. Das heißt du musst ihn in einen String umwandeln, weiß nicht auswendig wie das geht aber entweder mit return ausgabepuffer.toString();
    oder return StringBuffer.toString(ausgabepuffer);

  3. #3

    Title
    Master
    Join Date
    Apr 2002
    Posts
    146
    Thanks
    0
    Thanked 0 Times in 0 Posts
    was is überhaupt a string buffer

    es hat geklappt

    thx a lot

    das einzig blöde is dass in der spez. steht wir sollen das prog Testen.java (t gross)nennen ich kanns aber nur ausführen mit der Main.java wenn ich es testen.java (t klein) nenne..
    aber ich glaun das ist ein fehler der übungsleitung
    Last edited by girl; 03-05-2002 at 17:49.

  4. #4

    Title
    Dipl.Ing
    Join Date
    Mar 2002
    Location
    Wien 12
    Posts
    1,135
    Thanks
    72
    Thanked 366 Times in 208 Posts
    Einem String kann nur einmal ein Wert zugewiesen werden. Danach kann er eigentlich nicht mehr veraendert werden.

    Bei einem StringBuffer sind verschiedene Veraenderungen moeglich, z. B.: etwas anhaengen.

    Es gibt zwar auch beim Datentyp String eine Methode um etwas anzuhaengen, aber intern wandelt Java den String erst in einen Stringbuffer um, haengt die gewuenschte Zeichenkette an und wandelt es wieder in einen String zurueck.

    Das meinte ich mit quote: wer den Unterschied kennt /quote. Deswegen ist ein StringBuffer eigentlich effizienter.

    Allerdings sind String und StringBuffer zwei verschiedene Datentypen und deswegen muss man den StringBuffer wie oben gesagt in einen String umwandeln, denn von EprogIO.println() wird ein String erwartet.

    /korrektur:
    Hab' ich ganz uebersehen. Der Fehler liegt darin, dass perform() ja einen String zurueckgeben soll (... String perform()) und nicht weil EprogIO.println() einen String erwartet (siehe nachfolgenden Post).
    Last edited by yrucrem; 03-05-2002 at 22:46.
    Damn, here I was, minding my own business, just enjoying my second amendment rights, and you people have to FREAK out on me!

  5. #5
    DoomedOne
    deswegen muss man den StringBuffer wie oben gesagt in einen String umwandeln, denn von EprogIO.println() wird ein String erwartet.
    Das println geht auch mit StringBuffern, java wendet dann automatisch die toString Methode an.
    Deswegen kannst du auch arrays ohne angabe von einem index ausgeben lassen, über die Sinnhaftigkeit lässt sich in diesem Fall aber streiten.

    In diesem Fall ist es nicht gegangen da einfach an anderer Übergabewert erwartet wurde.

    Ich hab vor einiger Zeit mal den Source von der StringBuffer Klasse durchgesehen und dort werden auch fixe arrays für die Speicherung der chars verwendet. Deswegen ist die Klasse auch nur dann schneller wenn noch genug freierPplatz in dieser array enthalten ist, sonst muss erst recht die alte verworfen und eine neue aufgebaut werden.
    Ich frag mich warum die keinen Vektor für die Speicherung verwendet haben

  6. #6

    Title
    Dipl.Ing
    Join Date
    Mar 2002
    Location
    Wien 12
    Posts
    1,135
    Thanks
    72
    Thanked 366 Times in 208 Posts
    Hm, die Klasse selbst habe ich mir nie angesehen, aber das stimmt, wenn die Array groeszen fix sind, ist nicht viel anders als bei einem String.

    Aber trotzdem: wenn man gleich einen StringBuffer verwendet wird maximal ein neues Objekt erzeugt (naemlich der groeszere StringBuffer in den dann wieder alles reinpasst). Benutzt man einen String wird auf jeden Fall zuerst ein StringBuffer erstellt, dieser geandert und dann wird aus dem geaenderten StringBuffer ein String erzeugt (also zwei ueberfleussige Objekte).

    quote: warum die keinen Vektor für die Speicherung verwendet haben /quote. Meinst du mit Vektor einen Pointer oder java.util.Vector?
    Damn, here I was, minding my own business, just enjoying my second amendment rights, and you people have to FREAK out on me!

  7. #7
    DoomedOne
    ...maximal ein neues Objekt erzeugt...
    Stimmt schon aber bei der Daten array muss man ja alle alten chars wieder in die neue array schreiben was eine laufzeit von oldString.length() + newString.length() entspricht, aber halt nur wenn die alte array zu klein war sonst nur newString.length(), das ist glaub ich der einzige Unterschied.

    Das was ich mit dem Vektor gemeint hab ist die Vector Class in java. Die macht genau das Selbe wie der Stringbuffer d.h es gibt eine array die je nach Bedarf wächst. Also könnte man die StringBuffer Class eigentlich als eine extention der Vector Class ansehen, nur das die spezialisierter ist (chars statt obj).

    Das hätte auch den Vorteil das man leicht an die Funktionen der Collection Classes herankommt wenn man diese je brauchen sollte
    Bei manchen Anwendungen des Stringbuffers wäre eine Linked List sicher effizienter (wenn man oft etwas ändert und nicht ausliest) und die verwendet halt auch das Collection interface.

  8. #8

    Title
    Dipl.Ing
    Join Date
    Mar 2002
    Location
    Wien 12
    Posts
    1,135
    Thanks
    72
    Thanked 366 Times in 208 Posts
    Aber wenn man aus dem String einen StringBuffer erzeugt, muessen auch alle chars in das neue Array geschrieben werden (Laufzeit von oldString.length()), dann wird angehaengt (nochmal newString.length()), dann wird wieder in einen String geschrieben (old... + new...). Wenn man also an einem String etwas veraendern will, ist ein StringBuffer immer (wenn auch nur ein bisschen ;-)) geschickter.

    Allerdings muss ich jetzt auch mal sagen, dass ich es ziemlich seltsam finde zwei verschiedene Datentypen fuer Strings zu machen. Vor allem dass bei einem eigentlich gesagt wird, er kann nicht mehr veraendert werden und dann gibt es doch eine Methode die was anhaengen kann, aber die wandelt ihn dafuer zwischendurch in einen anderen Datentyp um ............. :)

    Wegen dem Vector gebe ich dir voellig recht. Ist eine recht praktische Datenstruktur, hat mir extrem bei meinem EProg-Mathe-"Parser" geholfen.
    Damn, here I was, minding my own business, just enjoying my second amendment rights, and you people have to FREAK out on me!

  9. #9
    DoomedOne
    Machen die das wirklich so komliziert?
    So schwer ist es ja nicht 2 String aneinander zu hängen.
    Warum brauch ich da einen StringBuffer dazwischen?
    Das ganze dynamische Zeugs das die Klasse drinnen hat ist in diesem Fall doch vollkommen nutzlos, weil man so wie so die genaue länge weiß.
    Ich würd das eher so machen:
    neue array arr, length = oldlen + newlen
    alte chars reinkopieren, neue anhängen, neue leere String Instanz erstellen, char-speicherarray = arr
    damit wird nur 1 pointer gesetzt und man braucht die ganze Stringbuffer Class nicht verwenden.
    Aber stimmt, java macht's immer möglichst langsam

  10. #10

    Title
    Elite
    Join Date
    Dec 2001
    Posts
    340
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Ok das ganze hier wird schon ein bissl off-topic, postets sowas bitte in die Programmier-Ecke, da is zur Zeit eh für meinen Geschmack ein bissl zu wenig los :coolsmile

    @DoomedOne, warum sie keinen Vector verwendet haben: ein Vector macht, wie du richtig festgestellet hast, dasselbe nur mit Objects. char ist aber eine primitive Datenstruktur (in dem Fall eine 16-bit Integer, die halt einen Unicode Wert repräsentiert). Ein Object ist die "einfachste vorstellbare" (wie auch immer) Java Klasse, von der alle anderen abgeleitet werden. Daher braucht eine solche um ein vielfaches mehr Speicher, muss erst inizialisiert werden,... für weiter Details bitte den Sourcecode zur JVM konsultieren, Sun stellt den ihren zur Verfügung

    Die machen das so, weil Java von Anfang an auf Security ausgelegt war und im Nachhinein veränderbare Strings irgendwem da nicht ins Konzept gepasst haben. Dafür gibts halt dann die StringBuffer. Und bei einem StringBuffer wird ja, wenn das char Array voll ist, ein neues alloziert und der Inhalt des alten mit System.arraycopy() - glaub ich - reinkopiert. Das geht recht flott weil die Methode native ist. Der Speicherplatz des alten Arrays bleibt dank Garbage Collection nicht lange belegt...

    Ich hoff ddamit sind alle Fragen beantwortet
    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •