# Leerzeichen im char Array setzen



## chillerStudent (13. Dez 2011)

Guten Tag,

wenn ich z.b. einen String habe, den ich zu einem char array umwandele. Das char array bearbeite ich und konvertiere wieder zu einem String. 
Wie schaffe ich es, dass die leerzeichen trotzdem enthalten sind?

z.b.


```
String st = "";
for(int i=0; i<args.length; i++) {
	st += args[i];
}
char[] a = st.toCharArray();
//...

String g = new String(a);
System.out.print(g);
```

Es muss aber nicht sein, dass es am Ende wieder zu String umgewandelt wird. Hauptsache die leerzeichen sind enthalten.


----------



## irgendjemand (13. Dez 2011)

also was auch immer dein for()-loop da machen soll ... würde ich definitiv anderst lösen ...

ansonsten : String.toCharArray() entfernt whitespaces 0x20 ? ... nicht das mir das bekannt wäre ... liegt wahrscheinlich an dem code mit dem du das char-array manipulierst ...

ist aus dem stück code da leider nicht ersichtlich


----------



## Michael... (13. Dez 2011)

Wo verschwindenen die Leerzeichen. Nichts aus dem von Dir gezeigten Code lässt Leerzeichen aus einem String oder einem char-Array verschwinden.

Gib doch einfach mal direkt nach der Schleife 
	
	
	
	





```
st
```
 auf der Konsole aus. Vermutlich wirst Du entgegen Deiner Erwartung (woher die auch immer kommt) keine Leerzeichen finden.


----------



## bygones (13. Dez 2011)

und mit code:

```
public static void main(String[] args)  {
        String s = "H A L L O";
        char[] c = s.toCharArray();
        String t = new String(c);
        System.out.println(t); // Ausgabe: H A L L O
    }
```


----------



## Kiri (13. Dez 2011)

Dein Problem dürfte sein, dass in args keine Leerzeichen vorhanden sind, da die args durch Leerzeichen bei der Eingabe getrennt sind. 

Das heißt die Eingabe: Argument1 Argument2 
ergibt: args[0] = "Argument1"; args[1] = "Argument2"; --> kein Leerzeichen


----------



## chillerStudent (13. Dez 2011)

> Gib doch einfach mal direkt nach der Schleife st auf der Konsole aus. Vermutlich wirst Du entgegen Deiner Erwartung (woher die auch immer kommt) keine Leerzeichen finden.


Ich möchte nicht das st ausgeben sondern das char array.


Ohh, sorry sorry, ich hab da was ganz wichtiges vergessen. 

Vergisst bitte den ersten code: hier der neue

```
StringBuffer b = new StringBuffer();
for(int i=0; i<args.length; i++) {
			b.append(args[i]);
		}
char[] a = b.toString().toCharArray();

//...

String g = new String(a);
System.out.print(g);
```


----------



## chillerStudent (13. Dez 2011)

Kiri hat gesagt.:


> Dein Problem dürfte sein, dass in args keine Leerzeichen vorhanden sind, da die args durch Leerzeichen bei der Eingabe getrennt sind.
> 
> Das heißt die Eingabe: Argument1 Argument2
> ergibt: args[0] = "Argument1"; args[1] = "Argument2"; --> kein Leerzeichen



Genauaa!!
Das ist mein Problem. Gibt es eine MÖglichkeit Leerzeichen einzufügen?


----------



## chillerStudent (13. Dez 2011)

Ich haaabss...


```
for(int i=0; i<args.length; i++) {
            b.append(args[i]+" ");
        }
```

Danke euch allen!


----------



## Kiri (13. Dez 2011)

Zur Anregung: Bedenke aber auch, das du nach dem letztem Argument kein Leerzeichen willst.


----------



## faetzminator (13. Dez 2011)

Wenn du schon einen Builder verwendest, dann bitte gleich ohne Stringkonkatenationen:

```
for(int i = 0; i < args.length; i++) {
    b.append(args[i]);
    b.append(' ');
}
```
Zusätzlich kannst du aber das Leerzeichen am Schluss (oder Anfang) weglassen:

```
for(int i = 0; i < args.length; i++) {
    if (i != 0) {
        b.append(' ');
    }
    b.append(args[i]);
}
```
Oder wenn du es nachträglich mit [c]trim()[/c] machen willst:

```
for(String value : args) {
    b.append(value);
    b.append(' ');
}
String str = b.toString().trim();
```
Da verlierst du aber natürlich auch allfällige Leerzeichen am Anfang des ersten bzw. am Ende des letzten Parameters.


----------



## chillerStudent (13. Dez 2011)

Kiri hat gesagt.:


> Zur Anregung: Bedenke aber auch, das du nach dem letztem Argument kein Leerzeichen willst.



In welchen Fällen wäre das wichtig? Ich meine sieht man ja nicht.


----------



## faetzminator (13. Dez 2011)

chillerStudent hat gesagt.:


> In welchen Fällen wäre das wichtig? Ich meine sieht man ja nicht.



[c]"foo bar baz "[/c] ist einfach nicht das gleiche wie [c]"foo bar baz"[/c]. Aber wenn dir das egal ist...


----------



## chillerStudent (13. Dez 2011)

Ich hab da mal noch eine Frage. Aber möchte jetzt nicht ein neues Thema anfangen.

Wenn z.b. in einem wort wie "otto" zwei mal hintereinander der gleiche Buchstabe vorkommt wie schaffe ich es dass es nur einmal am ende ausgegeben wird: "oto"

Gibt es in java eine delete funktion für char?


----------



## Michael... (13. Dez 2011)

Arrays sind starre Konstrukte. Einmal angelegt sind sie in Ihrer Aufnahmekapazität fix.
Aus einer List wäre ein Löschen möglich.
Bei einem Array könnte man die Inhalte verschieben z.B. bei 
	
	
	
	





```
o t t o
```
 den Inhalt von Index 2 mit dem Inhalt von Index 3 überschreiben. Allerdings wäre das Array immer noch vier Felder lang und man müsste die Inhalte z.B. per System.arraycopy(...) oder einer Schleife in ein neues char[3] kopieren.

Wenn es allerdings wie beschrieben um die Ausgabe geht recht es sich den zuletzt ausgegebenen Buchstaben zu merken und falls der darauf folgende Buchstabe gleich ist diesen einfach nicht auszugeben.


----------



## chillerStudent (13. Dez 2011)

ok. verstehe. So?


```
StringBuffer b = new StringBuffer();
for(int i=0; i<args.length; i++) {
            b.append(args[i]);
        }
char[] a = b.toString().toCharArray();
 
//...
if(a[i+1] == a[i]) {
 a[i+1] = ' ' ; // ???
 }
String g = new String(a);
System.out.print(g);
```


----------



## Kiri (13. Dez 2011)

so würde es gehen:


```
char[] a = new char[4];
        a[0] = 'O';
        a[1] = 't';
        a[2] = 't';
        a[3] = 'o';
       
        for(int i = 0; i < a.length; i++)
        {
            if(i<a.length-1)
            {
                if(a[i] != a[i+1])
                {
                    System.out.print(a[i]);
                }
            }else
            {
                System.out.print(a[i]);
            }
        }
        System.out.println();
```


----------



## chillerStudent (13. Dez 2011)

Gibt es eine Möglichkeit zwei Zeichen z.b. *bc* in einem char Array "behälter" zu speichern?


----------



## Kiri (13. Dez 2011)

meinst du sowas:


```
char[] a = new char[2];
        a[0] = 'b';
        a[1] = 'c';
```

oder was?


----------



## chillerStudent (13. Dez 2011)

Kiri hat gesagt.:


> meinst du sowas:
> 
> 
> ```
> ...



Nein, ich meine sowas:


```
char[] a = new char[2];
        a[0] = 'bc'; // natürlich falsch
```

Also wenn ich ein String in ein char array umwandele soll er die letzten zeichen die zusammen gehören
nicht trennen. 
zb. 

```
String s = "ich lerne java";
StringBuffer sb = new StringBuffer(s);
char[] c = sb.toString().toCharArray();
```

Das letzte wort "java" soll nicht in einzelne zeichen getrennt werden.


----------



## eRaaaa (13. Dez 2011)

Dann ist ein char-Array einfach die falsche Wahl.... 'xx' ist eben kein char mehr ?! :autsch:


----------



## Kiri (13. Dez 2011)

char steht für Character und damit für genau ein Zeichen! Zwei Zeichen wären schon ein String.


----------



## AmunRa (13. Dez 2011)

Das letzte Wort eines Strings kannst du mit


```
String s="Hallo Java";
String java = s.substring(s.lastIndexOf(" ")+1);
System.out.println(java);
```


erhalten


----------



## chillerStudent (13. Dez 2011)

AmunRa hat gesagt.:


> Das letzte Wort eines Strings kannst du mit
> 
> 
> ```
> ...



Funktioniert aber nicht mit einem StringBuffer oder? Also wenn man statt einem String ein StringBuffer hat?!


----------



## Michael... (13. Dez 2011)

chillerStudent hat gesagt.:


> Funktioniert aber nicht mit einem StringBuffer oder? Also wenn man statt einem String ein StringBuffer hat?!


Weiß spontan nicht welche Methoden ein StringBuffer bietet aber man kann sich auf jeden Fall den Inhalt des Buffers als String holen.


----------



## Kiri (13. Dez 2011)

chillerStudent hat gesagt.:


> Funktioniert aber nicht mit einem StringBuffer oder? Also wenn man statt einem String ein StringBuffer hat?!


  Ausprobieren, sollte klappen.  

```
StringBuffer sb = new StringBuffer();
sb.append("Ich lerne Java");
String java = sb.substring(sb.lastIndexOf(" ")+1); 
System.out.println(java);
```


----------



## chillerStudent (13. Dez 2011)

geht nicht wenn ich sowas hab


```
for(int i=0; i<args.length; i++) { 
			b.append(args[i]+" ");
		}
		String java = b.substring(b.lastIndexOf(" ")+1);
		System.out.println(java);
```


----------



## Kiri (13. Dez 2011)

chillerStudent hat gesagt.:


> geht nicht wenn ich sowas hab
> 
> 
> ```
> ...




Nein, weil du jetzt das Problem hast, dass das letzte Zeichen ein Leerzeichen ist!


----------



## chillerStudent (13. Dez 2011)

ich glaub ich verstehe diese zeile nicht richtig:

b.substring(b.lastIndexOf(" ")+1);

was macht lastIndexOf ?


----------



## Michael... (13. Dez 2011)

chillerStudent hat gesagt.:


> geht nicht wenn ich sowas hab
> 
> 
> ```
> ...


Denke jetzt kannst Du Dir Deine zuvor gestellte Frage selbst beantworten ;-)
http://www.java-forum.org/java-basics-anfaenger-themen/128733-leerzeichen-char-array-setzen.html#post839324


----------



## Michael... (13. Dez 2011)

chillerStudent hat gesagt.:


> ich glaub ich verstehe diese zeile nicht richtig:
> 
> b.substring(b.lastIndexOf(" ")+1);
> 
> was macht lastIndexOf ?


StringBuffer (Java Platform SE 6)


----------



## Kiri (13. Dez 2011)

chillerStudent hat gesagt.:


> ich glaub ich verstehe diese zeile nicht richtig:
> 
> b.substring(b.lastIndexOf(" ")+1);
> 
> was macht lastIndexOf ?



lastIndexOf sucht nach dem Zeichen (" ") und zwar nach dem letzten Vorkommen

Beispiel "Ich lerne Java", hier wäre es das Leerzeichen vor "Java"!
+1 er soll ein Zeichen später anfangen, hier das "J"

Dein Problem ist deine Strings sehen so aus "Ich lerne Java ", da ist das letzte " " nach dem "Java", deshalb funktioniert es bei dir nicht. Aber am Anfang dieses Thread haben wir dich schon darauf hingewiesen, dass letzte Leerzeichen zu entfernen. Du hast in diesem Thread alles, was du brauchst.


----------



## chillerStudent (13. Dez 2011)

Sehr schön. Habe verstanden. 
Also muss ich subtrahieren.


----------



## Kiri (13. Dez 2011)

chillerStudent hat gesagt.:


> Sehr schön. Habe verstanden.
> Also muss ich subtrahieren.



Nein, du musst das letzte Leerzeichen entweder entfernen oder dafür sorgen, dass es gar nicht erst entsteht.

substring(startindex); --> hier wird aus einem String/StringBuffer der Teil ausgewählt ab dem startindex bis zum Ende. Das +1 steht dafür, dass das Leerzeichen nicht mit ausgewählt wird, sondern erst ein Zeichen später angefangen (+1) wird.


----------



## TKausL (14. Dez 2011)

Edit: Seite 2 nicht gesehen :lol:

Edit2: Wofür steckst du denn alle args in einen String, um danach wieder das letzte Wort (das letzte arg) rauszuholen?


----------

