charArray verlängern

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
Hi!

Ich habe gestern schon mal was zu dem Thema gepostet:

Für alle, die das Beispiel von gestern nicht kennen!

ich habe eine Klasse Buffer:

Code:
class Buffer {
	    public  char[] buf;
	    public  int free; //nóch freier Platz
	    int size;
	    public int StringPos;

	    public Buffer(int size) {
	      buf = new char[size];
	      this.free = size;
	    }

	    public Buffer(){
		this.size=10;
		buf=new char[size];
		this.free=size;
		}

	    public void append(String s) {
	      int size = buf.length;
	      int StringPos = 0;
	      while (free > 0 && StringPos < s.length()) {
	        buf[size - free] = s.charAt(StringPos);
	        free--;
	        StringPos++;
	      }
	    }

	    public String toString() {
	      return new String(buf, 0, buf.length - free);
	    }




	public static void main(String [] args){

		Buffer b1=new Buffer(10);
		b1.append("Thomas");
		b1.append("Franz");
		System.out.println(b1);

	}

}


...es geht nur um die append-Methode!
also String in char-Array schreiben...wenn zu lang, einfach die überschüssigen ignorieren!

------

JETZT möcht ich die append-Methode überschreiben:
Nämlich wenn der String zu lang ist, soll der Buffer-Inhalt in ein doppelt so großes char-Array umkopiert werden!Ok?
Nur leider funktioniert das nicht!

Code:
public class Text extends Buffer{


	char [] buf2;
	int free;


	public Text(int size){

		super(size);
		this.free=size;
	}

	public void append(String s){


		super.append(s);
		if(free == 0 && StringPos >= s.length()){ //HIER MUSS DER FEHLER LIEGEN!komm leider nicht drauf!
			buf2=new char[size*2];


			for(int i=0;i<buf.length;i++){
				buf2[i]=buf[i];
			}
		}
		buf2=buf;

	}



	public static void main(String [] args){

		Text t1=new Text(10);
		t1.append("Thomas");
		t1.append("WernerHans");
		System.out.println(t1.toString());
	}



}

Danke für eure Hilfe!!
 

Sky

Top Contributor
1.) Warum hast Du eine Ableitung gemacht? Du könntest auch einfach die Klasse Buffer erweitern

2.) Du rufst die append Methode der Super-Klasse auf. Nur hast Du leider keine Ahnung, ob das Einfügen geklappt hat! Somit kannst Du auch nicht wissen, ob dein Buffer vergrössert werden muss. (Dein weg könnte zwar gehen, ist aber ein wenig umständlich). Also erst prüfen, ob der einzufügende String reinpasst, dann die super-Klasse das append durchführen lassen.
 

Sindbad1983

Top Contributor
1. weil das Vorgabe ist
2. kann dir nicht ganz folgen!
ich muss ja vorher die append-Methode der Super-Klasse aufrufen...wenn da nicht mehr genug Platz ist, soll er das Array verlängern?
Oder hab ich da einen Denkfehler?..wieder mal :-(
 

Griffin

Bekanntes Mitglied
Also wenn ich bei Schleifen nicht weiter komme gebe ich die Werte meistens aus, um zu sehen was mit ihnen passiert!

Erstes Problem:
In der Schleife in der Methode append (in Buffer) erreicht dein StringPos, bei diesem Beispiel, nicht die Länge von s. Das free kommt aber auf 0.

Zweites Problem:
Setzt man eine Ausgabe in der Klasse Text in append, die die Variablen free und StringPos ausgibt, sind diese immer 10 für free und 0 für StringPos, also die Startwerte!

Außerdem, warum fragst du ab, ob StringPos gößer ist als die Länge? Du brauchst doch nur zu wissen, ob da drin noch Platz ist oder nicht!?
 

Griffin

Bekanntes Mitglied
Ich hab die Lösung:

Du hast in der Klasse die Variable free. Aber:
Code:
if(free == 0 && StringPos >= s.length()) ...

Hier versuchst du auf die Variable von der Klasse Buffer zuzugreifen, aber die ist von deiner Variable in Text überschrieben!!
Wenn du den Namen der Variable in Text veränderst, dann funzt auch deine Abfrage besser.

EDIT:
Ein weiterer Fehler kommt noch dazu: Auch mit size gibt es Probleme, da die Variable den Wert 0 hat und somit ein ArrayIndexOutOfBounds kommt, wenn man bei der Schleife in Text ankommt!

Code:
//So funzt es zumindest bei mir Fehlerfrei

public class Text extends Buffer{
   char[] buf2;
   int size;

   public Text(int size){
      super(size);
      this.size = size;
   }

   public void append(String s){
      super.append(s);
      if(free == 0){
         buf2 = new char[size*2];

         for(int i=0;i<buf.length;i++){
            buf2[i]=buf[i];
         }
         System.out.println("bu2 ist nun laenger: " + buf2.length);
      }
   }

   public static void main(String [] args){
      Text t1=new Text(10);
      t1.append("Thomas");
      t1.append("WernerHans");
      System.out.println(t1.toString());
   }
}
 

Sindbad1983

Top Contributor
was meinst du mit verändern?
ich überschreib free eh nicht, oder?
soll ich die Variable anders benennen?..das hilft aber auch nichts, denk ich mal!
Ich weiß grad nicht, worauf du hinaus willst? :-(
 

Griffin

Bekanntes Mitglied
Ich hab ein Edit gemachtz... s.o.
Mit überschreiben meine ich, dass du in der Klasse Buffer und in Text die gleiche Variable free hast!
Wenn du nu schreibst:
Code:
if (free == 0 && ...
Woher soll der Compiler wissen, dass du das free in Buffer meinst??
 

Sindbad1983

Top Contributor
was bei dir geht?

hm...das ist komisch...bei mir noch immer nicht!!!

bu2 ist nun laenger: 20
ThomasWern
Drücken Sie eine beliebige Taste . . .

komisch...
Danke für deine Hilfsbereitschaft!
 

Sky

Top Contributor
Ich habe deinen Code etwas angepasst. Versuchs doch mal!

Code:
public class Text extends Buffer {
  // char [] buf2; // braucht man nicht als Klassenvar.
  // int free; // braucht man nicht... gibt's schon in der Basisklasse

  public Text(int size) {
    super(size);
    // this.free=size; // wird durch 'super(size)' gesetzt!
  }

  public void append(String s) {
    // buf2 = buf setzen
    char[] buf2 = buf;  

    // solange den buffer vergroessern, bis er reicht ;-)
    while ( s.length() > free ) {
        // Buffer vergroessern
        buf2=new char[buf.length*2]; 
        // free um den 'Erhöhungs-Faktor' vergroessern
        free+=buf.length;
    }

    // Wenn buf2 verlaengert wurde, so muss kopiert werden
    // Guck doch auch mal unter System.arraycopy !
    if ( buf2.length > buf.length ) {
      for(int i=0;i<buf.length;i++){
        buf2[i]=buf[i];
      }
      buf=buf2;
    }
    // nun, wo der buf gross genug ist, den String 's' anhaengen.
    super.append(s);
   }

   public static void main(String [] args){
      Text t1=new Text(10);
      t1.append("0123456789");
      t1.append("0123456789");
      t1.append("0123456789");
      t1.append("0123456789");
      t1.append("0123456789");
      t1.append("0123456789");
      System.out.println(t1.toString());
   }
}

Was ich noch dazu sagen muss: Ich finde die Lösung nicht unbedingt schön. Nur wollte ich nicht dein ganzes Konzept über den Haufen werfen. Zum Beispiel: normalerweise sind Variabeln private und über entsprechende getter und setter zu ändern sind.
 

Griffin

Bekanntes Mitglied
@Sindbad1983
Nämlich wenn der String zu lang ist, soll der Buffer-Inhalt in ein doppelt so großes char-Array umkopiert werden!Ok?

Das Problem habe ich gelöst. Jetzt musst du nur noch das eigentliche Einfügen des Strings in den Buffer erledigen, das hattest du ja noch nicht!
 

Sky

Top Contributor
Griffin hat gesagt.:
Das Problem habe ich gelöst. Jetzt musst du nur noch das eigentliche Einfügen des Strings in den Buffer erledigen, das hattest du ja noch nicht!

Wie ich geschrieben hatte: Erst den Buffer erhöhen und dann den String einfügen.
 

Sindbad1983

Top Contributor
aber wieso?
Ich füg ja den String eh ein!

Code:
public static void main(String [] args){
      Text t1=new Text(10);
      t1.append("Thomas");
      t1.append("WernerHans");
      System.out.println(t1.toString());
   }

Es müss ja eigentlich gehn!
 

Griffin

Bekanntes Mitglied
Du fügst den String in buf ein, das hat eine Begrenzung von 10. Dann kopierst du buf ind buf2. Das War's!!!
Du fügst ja nicht den Rest des Strings in buf2 ein sondern lässt ihn dann einfach so!
 

Sky

Top Contributor
Hast Du meine Version schon probiert??


Sindbad1983 hat gesagt.:
9 Stunden durchgehend programmieren ist wohl doch zu lang! :)
Du programmierst nur in deiner Freizeit / Schule / Ausbildung ? Danach (wenn man 'richtig') arbeitet ist das nix ungewöhnliches... Ich war heute sogar länger als 9 Stunden auf Arbeit... ;-)
 

Sindbad1983

Top Contributor
ja klar..die geht perfekt! Danke!!!
Aber ich weiß jetzt noch immer nicht, wo der Fehler bei meinem Programmal liegt!Leider!

Eigentlich müsst es ja gehn!
 

Sky

Top Contributor
Die Fehler im Quell-Code habe ich Dir nicht erklärt, weil Griffin das alles schon ganz gut analysiert und erklärt hatte... und das Wort eigentlich gibt es beim Proggen nicht... entweder es geht oder halt nicht :) Leider !
 

Griffin

Bekanntes Mitglied
Deine Fehler im Programm waren:
Doppeldeutigkeit der Variablen (2 mal)
Falsche If-Abfrage (1 mal)
Falsche Reihenfolge der Bearbeitung
(Unnötige Variablen)

Das soll jetzt nicht niedermachend wirken, aber du hast ja nach den Fehlern gefragt. Schau dir deinen Quellcode an und dann meinen, dann siehst du, dass dort einiges anders ist. Und Sky80 hatt dann die (perfekte) Lösung ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben