# String/StringBuffer mit Zeichen einer Sorte füllen



## da1l6 (29. Jun 2006)

Hallo

Ein eigentlich simples Problem auf das ich einfach keine Antwort finde: :?

Wie füge ich in einen StringBuffer eine Folge von Leerzeichen (am Anfang) ein.
Da die Methode insert es erlaubt dort ganze Strings einzufügen, würde mir ein String voller Leerzeichen reichen.
So in etwa:


```
myString.fill(" ", numSpaces);
```


da1l6


----------



## The_S (29. Jun 2006)

Versteh grad net so genau was du möchstest. Sry.


----------



## Murray (29. Jun 2006)

Ist vorher bekannt, wieviel Leerzeichen maximal eingefügt werden müssen? Dann geht das so

```
sb.insert( 0, "                                       ".substring( 0, anzahlLeerzeichen));
```
Dabei muss die Stringkonstante ausreichend lang sein.

Ansonsten bleibt wohl nur der Weg über eine Schleife:

```
for ( int i=0; i<anzahlLeerzeichen; i++) sb.insert( 0, ' ');
```


----------



## byte (29. Jun 2006)

Murray hat gesagt.:
			
		

> ```
> sb.insert( 0, "                                       ".substring( 0, anzahlLeerzeichen));
> ```



Auf was für verrückte Ideen manche doch kommen... :roll:


----------



## Murray (29. Jun 2006)

byto hat gesagt.:
			
		

> Auf was für verrückte Ideen manche doch kommen... :roll:


Bitte?


----------



## Einwegdose (30. Jun 2006)

"Verrückt" in sofern dass es nicht sehr professionell gelöst aussieht und zudem noch unsicher ist.
Ich denke eine for-schleife ist wohl das Beste 

Bzw wenn du vorher die Leerzeichen als String hast:


```
StringBuffer sb = new StringBuffer(leerzeichenString);
```


----------



## Murray (30. Jun 2006)

Einwegdose hat gesagt.:
			
		

> "Verrückt" in sofern dass es nicht sehr professionell gelöst aussieht und zudem noch unsicher ist.
> Ich denke eine for-schleife ist wohl das Beste



Das wollte ich schon immer mal wissen - woran erkennt man denn "professionelle" Lösungen? Und zur Unsicherheit: unsicher ist das nur dann, wenn man vorab nicht weiss, wieviel Leerzeichen einzufügen sind.

Die substring-Lösung dürfte bzgl. Performance die Nase vorn haben; nur deshalb würde ich sie einsetzen, wo die Randbedingungen (s.o.) es zulassen


----------



## Beni (30. Jun 2006)

Professionelle Lösungen erkennt man meist daran, dass sie sehr generisch sind (z.B. keine Voraussagen über die Anzahl Zeichen machen).

Aber... professionelle Lösungen sind nicht unbedingt schnelle Lösungen. Deine Variante dürfte im Bezug auf die Performance wirklich etwas vom besten sein.

Um deine Idee generischer zu machen: ich würde nicht direkt einen String "  [...]  " schreiben, sondern einen StringBuilder benutzen, der lauter Leerzeichen enthält. Falls der Builder zu klein ist, könnte man ihm weitere Leerzeichen hinzufügen. Mit "subSequence" hat man etwas ähnliches wie "subString". Der Builder ist dann ein Cache den man natürlich irgendwo speichern muss :wink:


----------



## Murray (30. Jun 2006)

Beni hat gesagt.:
			
		

> Professionelle Lösungen erkennt man meist daran, dass sie sehr generisch sind (z.B. keine Voraussagen über die Anzahl Zeichen machen).


Würde ich so nicht unterschreiben. "Professionell" heisst für mich in erster Linie "im Rahmen einer bezahlten / beruflichen Tätigkeit". Über die Qualität sagt das erstmal nicht aus - ausser der Tatsache, das irgendjemand bereit ist, dafür Geld zu bezahlen



			
				Beni hat gesagt.:
			
		

> Um deine Idee generischer zu machen: ich würde nicht direkt einen String "  [...]  " schreiben, sondern einen StringBuilder benutzen, der lauter Leerzeichen enthält. Falls der Builder zu klein ist, könnte man ihm weitere Leerzeichen hinzufügen. Mit "subSequence" hat man etwas ähnliches wie "subString". Der Builder ist dann ein Cache den man natürlich irgendwo speichern muss :wink:


Gute Idee. Wenn ich aber die maximale Länge von Leerzeichen wirklich kenne, dann würde ich doch bei der einfachen Lösung mit der Konstanten bleiben wollen, da das vom Compiler (oder spätestens vom JIT bzw. von der Hotspot-VM) vermutlich besser optimiert werden kann.


----------



## Beni (30. Jun 2006)

Ich würde nicht sagen, "beruflich -> professionell". Es gibt mehr als genug Software, die das Gegenteil beweist... Ich würde sagen, "professionell = gut".

Op die Anzahl Zeichen im voraus bekannt sind, kann nur der Threadersteller sagen. Aber ich würde unbedingt irgendeine Sicherung einbauen, damit man diese Zahl im Nachhinein ändern kann (ohne dass man wild nach allen, nun auftretenden, Fehlerquellen suchen muss).


----------



## Murray (30. Jun 2006)

Beni hat gesagt.:
			
		

> Ich würde nicht sagen, "beruflich -> professionell". Es gibt mehr als genug Software, die das Gegenteil beweist... Ich würde sagen, "professionell = gut".


Da stehst Du vermutlich im Widerspruch zu den meisten Wörtbüchern, aber genug der Spitzfindigkeiten



			
				Beni hat gesagt.:
			
		

> Op die Anzahl Zeichen im voraus bekannt sind, kann nur der Threadersteller sagen.


Richtig, deshalb habe ich gefragt



			
				Beni hat gesagt.:
			
		

> Aber ich würde unbedingt irgendeine Sicherung einbauen, damit man diese Zahl im Nachhinein ändern kann (ohne dass man wild nach allen, nun auftretenden, Fehlerquellen suchen muss).


Das kann natürlich kaum schaden (etwas Performance frisst es eben doch). 

Fazit: 

```
private static final hinreichendVieleBlanks = "                                                    ";

public String insertBlanksBefore( int numBlanks, StringBuffer sb) {

 if ( numBlanks <= hinreichendVieleBlanks.length()) {
     sb.insert( 0, hinreichendVieleBlanks.substring( 0, numBlanks));
 } else {
     /* entweder Schleife oder Benis Variante mit variablen Cache */
 }

}
```


----------



## byte (1. Jul 2006)

Ich wollte Dir mit meinem Kommentar nicht zu nahe treten, sondern nur ausdrücken, dass ich auf so ne Idee nicht gekommen wäre. 

Ich würde halt ne einfache Schleife bevorzugen, weil der Code dann 1. übersichtlicher ist und 2. besser wiederverwendbar. Und das sind doch zwei der wichtigen Faktoren, die bei der "professionellen" Softwareentwicklung zählen. Du musst halt auch mal an den Kollegen denken, der Deinen Code vielleicht mal reviewed. 

Und wegen der Bedeutung von professionell: Natürlich steht im Duden "beruflich" als Bezeichnung, aber Beni hat genauso recht. Man meint damit dann halt auch guten Code. Denn nicht jeder Programmierer, der damit Geld verdient, produziert auch professionellen Code.


----------



## da1l6 (3. Jul 2006)

Hallo

Ui, da hab ich ja was losgetreten :shock: , naja

Danke für die Mühe, anscheinend hat Java ja wirklich keine Funktion dafür eingebaut ???:L , dann muss halt die For-Schleife her halten. :bloed: 
Die Zahl der Leerzeichen ist nicht bekannt und (theoretisch) auch nicht beschränkt.

da1l6


----------



## byte (3. Jul 2006)

da1l6 hat gesagt.:
			
		

> Danke für die Mühe, anscheinend hat Java ja wirklich keine Funktion dafür eingebaut ???:L , dann muss halt die For-Schleife her halten. :bloed:



Manchmal muss man halt doch noch selbst programmieren.


----------



## Guest (3. Jul 2006)

byto hat gesagt.:
			
		

> da1l6 hat gesagt.:
> 
> 
> 
> ...



Schon klar, ich meinte, dass diese Lösung irgendwie weder elegant noch besonders schnell ist, aber egal.


da1l6


----------

