# Zeichen in String löschen



## evil (8. Dez 2009)

Hallooo, ich mal wieder.. *nerv*

Ich hab ein Problem mit einer Anweisung. Und zwar, soll über die Kommandozeile folgendes eingegeben werden: 

java Programmname "hallo"

Dann sollen die ersten beiden stellen vom Wort gelöscht werden und ans Ende gehangen werden. Also:
lloha.


```
class Verschieben {
	static String verschieben(String neu) {
		StringBuffer sb = new StringBuffer();
		String s = sb.toString();
		return neu.toString();
	}
	
	public static void main(String[] args) {
		Out.println(verschieben(args[0]) + args[0].charAt(0) 
			+ args[0].charAt(1));
		
	}
}
```

Jetzt fehlt mir die Anweisung zum löschen. Eigentlich wollte ich es mit s.delete(from, to) machen und hatte dies in die 5. Zeile eingefügt. Der Compiler zeigt mir allerdings einen Fehler. ;(


----------



## bRainLaG (8. Dez 2009)

Ich habs grad mal bisschen nachgegoggelt und zumindest das Löschen von Zeichen kriegst mit Replace wohl hin.


```
String s = "Hai";
s = s.Replace( "i", "" );
```

Das heißt du ersetzt, die Stelle an der sich das i befindet durch einen leeren String und entfernst somit das Zeichen.


----------



## evil (8. Dez 2009)

das Problem dabei ist aber, dass ich nicht weiß, welche Buchstaben an den ersten beiden Stellen sind. Bei deinem Beispiel wird ja das i gelöscht, wenn ich das richtig verstanden hab


----------



## nrg (8. Dez 2009)

ich hätte das mal mit substring probiert.



			
				Java Docu hat gesagt.:
			
		

> Konstruktor mit einem Parameter:
> Examples:
> "unhappy".substring(2) returns "happy"
> "Harbison".substring(3) returns "bison"
> ...


----------



## bygones (8. Dez 2009)

wenn die anforderung so statisch ist (also immer die ersten 2 ans ende)

```
StringBuilder builder = new StringBuilder(args[0].substring(2);
builder.append(args[0].charAt(0)).append(args[0].charAt(1));
System.out.println(builder.toString());
```
ansonsten ist es natuerlich auch leicht zu generalisieren

```
String s = "hallo";
        int i = 2;

        StringBuilder builder = new StringBuilder(s.substring(i));
        for (int j = 0; j < i; j++) {
            builder.append(s.charAt(j));
        }
        System.out.println(builder.toString());
```


----------



## L-ectron-X (8. Dez 2009)

Mit StringBuffer gibts einige Möglichkeiten.

```
public static void main(String[] args) {
        if(args.length == 1) {
            StringBuffer sb = new StringBuffer();
            sb.append(args[0]).append(sb.substring(0, 2));
            System.out.println(sb.delete(0, 2).toString());
        }
    }
```


----------



## Ebenius (8. Dez 2009)

Vielleicht noch als Hinweis: Die Klassen StringBuffer und StringBuilder (neu seit JRE 5) sind gleich aufgebaut. Der StringBuffer ist allerdings thread save und damit zur Laufzeit deutlich aufwändiger als der StringBuilder. Wenn man den Puffer also nur in einem Thread oder ohnehin in synchronisierten Bereichen verwendet, sollte man StringBuilder statt StringBuffer benutzen.

Ebenius


----------



## L-ectron-X (8. Dez 2009)

Stimmt, war mir nicht entfallen, ich habe einfach nur die verkehrte Klasse benutzt.


----------



## Ebenius (8. Dez 2009)

Hab ich besonders erwähnt, weil direkt drüber noch ein Beispiel mit StringBuilder ist (wahrscheinlich gleichzeitig mit Deinem verfasst)...

Ebenius


----------



## evil (8. Dez 2009)

Irgendwie klappt das bei mir nicht

```
class Verschieben {
	static String verschieben(String neu) {
		StringBuffer sb = new StringBuffer();
		sb.append(args[0]).append(sb.substring(0, 2));
		sb.delete(0, 2);
		return neu.toString();
	}
	
	public static void main(String[] args) {
		Out.println(verschieben(args[0]));
		
	}
}
```

Der Compiler mag das "args" in sb.append nicht *verzweifel*


----------



## L-ectron-X (8. Dez 2009)

Es muss dann heißen:
[JAVA=4]sb.append(neu).append(sb.substring(0, 2));[/code]

Und benutze lieber doch den StringBuilder, der hat die gleichen Methoden.


----------



## Michael... (8. Dez 2009)

das args[0] in der Methode muss neu heißen (s. Deine eigene Methodedeklaration)


----------



## evil (8. Dez 2009)

Leider haben wir noch nichts mit dem StringBuilder gemacht. Nur normale Strings und Stringbuffer.  

Also irgendwas läuft da doch schief. jetzt hab ich das so geändert wie ihr gesagt habt. Append soll mir das hinten dran hängen und delete löscht die ersten beiden Buchstaben.


```
sb.append(neu).append(sb.substring(0, 2)).delete(0, 2);
```

gebe ich aber nun in die Kommandozeile java Programmname hallo ein, wird hallo unverändert wieder ausggegeben


----------



## Ebenius (8. Dez 2009)

Statt: [java=6]return neu.toString();[/code]
[java=9]return sb.toString();[/code]

Ebenius


----------



## evil (8. Dez 2009)

Ahhh, ihr seid Gold wert!!
Ich glaube ihr werdet mich heute noch öfters hier dumme Fragen stellen sehen 


Vielen Dank:toll:


----------



## Ebenius (8. Dez 2009)

Ich würde das übrigens gar nicht mit dem StringBuilder / StringBuffer machen. Eher so:

```
static String verschieben(String alt) {
  final int len = neu.length;
  final char[] neu = new char[len];
  for(int i = 0; i < len; i ++) {
    neu[i] = alt.charAt((i + 2 ) % len);
  }
  return new String(neu);
}
```
Hinweis: Die andere Methode mit StringBuilder / StringBuffer schmiert Dir ab, wenn der String kürzer als zwei Zeichen ist. Das muss in jedem Fall abgefangen werden.

BTW: Nicht vergessen: http://www.java-forum.org/forum-faq-beitraege/86306-thema-erledigt-markieren.html

Ebenius


----------

