# Mehrmaliges vorkommen eines Zeichens in einem String



## hogbart (6. Aug 2007)

```
String string = "Hallo mama";

int index = string.indexOf('a');    // 1
 
// Last occurrence
index = string.lastIndexOf('a');    // 9
```

was ist aber mit dem 1. "a" bei mama.

mit obigen methoden komme ich nur an das 1. a und das letzte a, was wäre aber wenn ich 10 "a"`s dazwischen haben?

Sollte ich etwa die länge des strings nehmen und jedes Zeichen in einer for schleife testen ob es ein a ist? Gehts nicht auch anders?


----------



## The_S (6. Aug 2007)

du kannst deinem indexOf noch ein weiteres Parameter übergeben. Dieses legt fest ab welchem Zeichen gesucht werden soll!


----------



## hogbart (6. Aug 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> du kannst deinem indexOf noch ein weiteres Parameter übergeben. Dieses legt fest ab welchem Zeichen gesucht werden soll!



   b = string.indexOf("a",0); // 0 heißt vom Anfang des Strings



> int 	indexOf(String str, int fromIndex)
> Returns the index within this string of the first occurrence of the specified substring, starting at the specified index.




```
String firstname = (String) dm.getValueAt(i,0);
    		
    		for(int j = 0 ; j < firstname.length(); j++)
    		{
    			 int pos = firstname.indexOf("a",j);
    			 System.out.println("Name: " + firstname + "Position: a bei" + pos);
    			
    		}
```

hab mal ein test gemacht:



> Name: Claudia Position: a bei 2
> Name: Claudia Position: a bei 2
> Name: Claudia Position: a bei 2
> Name: Claudia Position: a bei 6
> ...



scheint zu funktionieren!  

Wenn ich von einem String z.B.      "allabaster" alle position von a habe da möchte ich diese aus dem Wort herauslöschen  und die restlichen Teile des Strings zusammenbauen. Beispiel hier: "ll" + "b" + "ster" . Ich habe mal gelesen, dass das Zusammenbauen von Zeichenketten mit "+" operator langsam sei und wenn ich mein vorhaben auf 2000 benutzer anwende kann das schon mal 5 sekunden dauern... :-( Was wäre denn die effektivste Methode?


----------



## hogbart (6. Aug 2007)

```
StringBuffer buf = new StringBuffer();   
  
    buf.append("ll");      
    buf.append("b")
    buf.append("ster")
```

wäre das nicht am besten?


----------



## The_S (6. Aug 2007)

StringBuilder ist nochmal schneller. indexOf gibts auch direkt im StringBuilder. Dazu passend die Methode delete.


----------



## hogbart (6. Aug 2007)

danke dir:


```
for(int i = 0 ; i < dm.getRowCount();i++ )
    	{    		
    		String firstname = (String) dm.getValueAt(i,0);
    		StringBuilder buffer = new StringBuilder();
    		buffer.append(firstname);
    		for(int j = 0 ; j < firstname.length(); j++)
    		{    			
    			int pos = buffer.indexOf(" ",j);
    			if( pos > 0)
    			{
    				buffer.deleteCharAt(pos);  				
    			} 
    		}
    		System.out.println("Richtiger Name: " + buffer);
    	}
```

funzt 1a, sollte pos = 0 sein sprich "a" oder wie ich es möchte " " leerzeichen am anfangen sein wird es vorher eh per trim(); gekürzt, daher ist pos > 0 ok und nicht po>=0.


----------



## hogbart (6. Aug 2007)

```
public void bla()
    {    	
    	for(int i = 0 ; i < dm.getRowCount();i++ )
    	{    		
    		String firstname = (String) dm.getValueAt(i,0);
    		StringBuilder properName = new StringBuilder();
    		properName.append(firstname);
    		for(int j = 0 ; j < firstname.length(); j++)
    		{    			
    			int pos = properName.indexOf(" ",j);
    			if( pos > 0)
    			{
    				properName.deleteCharAt(pos);  				
    			}     				
    		}
    		dm.setValueAt(properName,i,0 ) ;    	    
    	}    	
    }
```

und schon zu früh gefreut...    :cry:  wenn ich die Methode ein 2. mal starte bekomme ich diese Fehler:


```
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.StringBuilder cannot be cast to java.lang.String
	at MainWindow.bla(MainWindow.java:158)
	at MainWindow.actionPerformed(MainWindow.java:212)
```

Rufe ich die methode bla zum 1. mal auf werden alle Personen in der zeile i und spalte 0 der Tabelle auf leerzeichen geprüft, das klappt nur beim erneuten Aufrufen der Methode bekomme ich obige Meldung.


----------



## SlaterB (6. Aug 2007)

dm.setValueAt(properName.toString(),i,0 ) ;


----------



## hogbart (6. Aug 2007)

SlaterB hat gesagt.:
			
		

> dm.setValueAt(properName.toString(),i,0 ) ;



danke geht aber warum klappts dann beim 1. mal da schreibe ich ja auch einen string vom typ stringbuilder in die tabellenzelle ??


----------



## SlaterB (6. Aug 2007)

tja, ich weiß es nicht, tippe aber, dass beim ersten Mal irgendwas anders ist 

es gibt da ein hochspezielles geheimes Verfahren, um zu überprüfen, was das Ding, genannt Programm, vor deinen Augen die ganze Zeit so macht,
ich verrate dir eine Anwendung:

System.out.println("setze propi")
dm.setValueAt(properName,i,0 ) ; 


kommt diese Meldung beim ersten Mal, aber keine Exception?
kann natürlich noch viele andere Stellen betreffen


----------



## hogbart (6. Aug 2007)

SlaterB hat gesagt.:
			
		

> tja, ich weiß es nicht, tippe aber, dass beim ersten Mal irgendwas anders ist
> 
> es gibt da ein hochspezielles geheimes Verfahren, um zu überprüfen, was das Ding, genannt Programm, vor deinen Augen die ganze Zeit so macht,
> ich verrate dir eine Anwendung:
> ...



ja ne kommt beim 1. mal ja nicht nur alle weitere male jetzt ists ja ok  :wink:


----------



## Guest (6. Aug 2007)

hogbart hat gesagt.:
			
		

> von einem String z.B.      "allabaster" alle position von a habe da möchte ich diese aus dem Wort herauslöschen  und die restlichen Teile des Strings zusammenbauen. [...] Was wäre denn die effektivste Methode?


Am effektivsten ist es, wenn Du den Quellstring Zeichen für Zeichen durchgehst und dann den Zielstring entsprechend zusammenbaust.


```
public static String löschen(String s, char a)
{
	final int l = s.length();
	final StringBuilder sb = new StringBuilder(l);
	for (int i=0; i<l; ++i)
	{
		final char c = s.charAt(i);
		if (c != a)
			sb.append(c);
	}
	return sb.toString();
}
```

Fred


----------



## hogbart (6. Aug 2007)

Anonymous hat gesagt.:
			
		

> hogbart hat gesagt.:
> 
> 
> 
> ...



das beispiel geht bei mir nicht da ich ein leerzeichen " " suche und das immer als string interpretiert wird und c != " "; funzt net ;-)


----------



## SlaterB (6. Aug 2007)

c != ' '


----------



## hogbart (6. Aug 2007)

SlaterB hat gesagt.:
			
		

> c != ' '



wollte schon ne Char.valueOf methode suchen  :wink:   :toll:


----------

