# Aus einem String blanks entfernen oder hinzufügen.



## JT. Montana (11. Mai 2008)

Hallo,
ich möchte einFunktionen schreiben die mir aus einem String alle Blanks (Leerzeichen) entfernt und eine Funktion die mir in einem vorhanden String nach jedem zweiten Zeichen, ein Blank hinzufügt.

Ich Funktion geschrieben, die eigentlich das erfüllt, aber sie ist ineffizient... sehr langsam...
Es ist eine Aufgabe für ein Studienfach in der wir lernen sollen mit StringBuilder Objekten umzugehen...
String.replace oder replaceAll sollen wir nicht benutzen.
Hier mein Code:

```
static public String blanksRaus(String s){
	   StringBuilder mitBlanks = new StringBuilder(s);
	   for(int e=0; e<5; e++){ //bis zu fuenf blanks hintereinander
			for(int i=0; i<mitBlanks.length(); i++){
				if(mitBlanks.charAt(i)==' '){
					mitBlanks.deleteCharAt(i);
				}
			}
		}
	   return mitBlanks.toString();
   }
   static public String blanksRein(String s){
		StringBuilder ohneBlanks = new StringBuilder(s);
		StringBuilder mitBlanks = new StringBuilder("");
		for(int i=0; i<ohneBlanks.length(); i+=2){
			mitBlanks.append(ohneBlanks.charAt(i));
			mitBlanks.append(ohneBlanks.charAt(i+1));
			mitBlanks.append(" ");
		}
	   return mitBlanks.toString();
   }
```
Wie ihr seht prüfe ich in blanksRaus ob in einem String max. 5 Blanks hintereinander stehen.... wie kann ich das automatisieren.. also mit einer while schleife prüfen, wieviele Blanks maximal hintereinander sind in einem String.
Ich hoffe jemand kann mir einen Tipp geben wie ich die Funktion besser programmiere.
Gruß
Jan


----------



## Gelöschtes Mitglied 5909 (11. Mai 2008)

mit regex... String noBlacks = string.replaceAll(" ", "");
die blanks rein zu machen geht mit regex wohl auch besser, is aber etwas komplizierter, kannst sie zum beispiel zählen und dann ein replace machen


----------



## JT. Montana (12. Mai 2008)

Hi,
replaceAll, oder replacer darf ich nicht benutzen.


----------



## SlaterB (12. Mai 2008)

> wie kann ich das automatisieren

verwende eine while()-Schleife und erhöhe den Index separat ein einer int-Variable

in der Schleife:
wenn aktuelles Zeichen ok, dann index erhöhen,
ansonsten aktuelle Zeichen entfernen und index NICHT erhöhen (in nächster Runde wieder gleichen index prüfen)

als Schleifenbedingung index mit String-Länge vergleichen

--------

das Löschen ist aber bei großen String womöglich durchaus inperformant, 
da alle Zeichen hinter dem gelöschten Char verschoben werden müssen,
also besser wie bei blanksRein mit zwei StringBuildern arbeiten:
nur die nicht-Leerzeichen kopieren, dann brauchst du auch keine komplizierte while-Scheile

----

allerdings bäuchtest du bei beiden eigentlich nur einen StringBuilder

StringBuilder ohneBlanks = new StringBuilder(s); 
ist ohne Funktion, 
length() und charAt() kannst du auch direkt auf den String aufrufen
----------

ansonsten halte ich das für ein recht effizientes Vorgehen,
was läßt dich vermuten, dass das langsam ist?

------

> mitBlanks.append(ohneBlanks.charAt(i));
> mitBlanks.append(ohneBlanks.charAt(i+1)); 

bei einem String ungerade Länge wirst du hier eine Exception bekommen,
verwende lieber eine normale i-Schleife mit ++ statt +=2

und nur bei ungeraden i (i % 2 == 1) fügst du ein Leerzeichen an


----------



## JT. Montana (13. Mai 2008)

Hi,
also ich habs jetzt hinbekommen...
es sollte allerdings zwischen zwei Zeichen ein Blank eingefügt werden... also nach jedem Zeichen.
Am ende sollte keins eingefügt werden.

```
static public String blanksRaus(String s){
	   StringBuilder ohneBlanks = new StringBuilder("");
	   for(int i=0; i<s.length(); i++){
			if(s.charAt(i)!=' '){
				ohneBlanks.append(s.charAt(i));
			}
		}
	   return ohneBlanks.toString();
   }
   static public String blanksRein(String s){
		StringBuilder mitBlanks = new StringBuilder("");
		if(s.length()>1){
			for(int i=0; i<s.length(); i++){
				mitBlanks.append(s.charAt(i));
				mitBlanks.append(" ");
			}
			mitBlanks.deleteCharAt(mitBlanks.length()-1);
		}else{
			for(int i=0; i<s.length(); i++){
				mitBlanks.append(s.charAt(i));
			}
		}
	   return mitBlanks.toString();
   }
```
Würde mich über kritik freuen.
Gruß
Jan


----------



## SlaterB (13. Mai 2008)

for(int i=0; i<s.length(); i++){ 
            mitBlanks.append(s.charAt(i)); 
            if (i % 2 == 1) {
mitBlanks.append(" "); 
}
         } 

---------

die Unterscheidung
 if(s.length()>1){ 
muss nicht sein, lass doch ein Leerzeichen einfügen und am Ende wieder löschen,
wenn nun aber nur nach jedem zweiten Zeichen dann musst du bei String-Länge 1 besonders aufpassen

am besten am Ende vor dem Löschen prüfen, ob das zu löschende letzte Zeichen ein ' ' ist,
dabei könnte allerdings auch ein normales ' ' entfernt werden..

dann lieber beim Einfügen prüfen:

         for(int i=0; i<s.length(); i++){ 
            mitBlanks.append(s.charAt(i)); 
            if (i % 2 == 1 und nicht letzte Position) {
mitBlanks.append(" "); 
}
         }


----------



## Grasstampfer (13. Mai 2008)

oder einfach so

```
static public String blanksRein(String s){
        StringBuilder mitBlanks = new StringBuilder(s);
        for ( int i = 1; i < mitBlanks.length(); i+=2 ) {
            mitBlanks.insert( i, " " );
        }
        return mitBlanks.toString();
     }
```


----------



## SlaterB (13. Mai 2008)

eine Liste (hier im entfernten Sinne) zu durchlaufen und sie gleichzeitig zu verändern ohne Iterator 
ist eines der bösen Dinge in Java/ Programmiersprachen, die man einzeln benennen kann,
davon rate ich dringend ab

durch das Verschieben der Buchstaben hätte man evtl. wieder die Inperformanz, die anfangs gemeint war,
ist aber vielleicht auch überhaupt nicht relevant/ vorhanden


----------



## JT. Montana (13. Mai 2008)

Slater.. mein Prof. möchte nicht das ich "einen If-Regenschirm in einer Schleifendusche" benutze


----------



## SlaterB (13. Mai 2008)

alles klar


----------

