# Char-Array nach einem Wort durchsuchen!



## Florian123 (30. Dez 2009)

Hallo Zusammen

Ich habe eine Datei "in.txt" die hat 3 Zeilen:

 Das   ist die  erste ist   Zeile
    Das   ist die  zweite   Zeile
          Das ist  dritte     Zeile

Zwischen den Wörtern hatts verschieden viele Leerzeichen.
Ich kann die Datie einlesen, Array mit der Grösse 3 jede Zeile einlesen.
Dann übergebe ich diese 3 Zeilen, Zeile für Zeile in eine Funktion die mir diese Zeilen durchschauen soll und nach einem bestimmten Wort durchsuchen soll und am Schluss in eine Variable speichern, wievielmal dieses Wort in dieser Zeile vorgekommen ist.


```
/************************************************************************
	* FUNCTION: SearchPattern												*
	*************************************************************************
	* Sucht nach dem angegebenen Pattern und gibt den Zähler aus.			*
	************************************************************************/
	public static String SearchPattern (String input, String pattern){
		
		int i = 0;
		int j = 0;
		int patterncount = 0; 
		int patternexist = 0;
		String patterncount_string = "";
			
		input = input.trim();
		
		char [] inputchararray = input.toCharArray();
		char [] patternchararray = pattern.toCharArray();
			
		for (i = 0; i < inputchararray.length; i++){
			
			if (inputchararray[i] == patternchararray[0]){
				
				for (j = 0; j < patternchararray.length; j++){
					
					if (inputchararray[i+j] == patternchararray[j]){
						
						patterncount++;
						System.out.println("ok");
					}
					
				}
				
				if (patterncount == patternchararray.length){
					
					patternexist++;
				}
				
			}

		}
		
		System.out.print(patternexist);
		
		return (patterncount_string.valueOf(patternexist));
		
				
	}//SearchPattern
```

Nun irgendwie funktioniert das ganze noch nicht mit den Schleifen.

Zuerst mach ich aus den Strings CharArrays.

Die Funktion überprüft dann, ob das erste Zeichen des gesuchten Wortes im input (derZeile) vorhanden ist, sobald das erste Zeichen vorhanden ist geht er in eine FOR Schleife bei welcher er nach den weiteren folgenden Zeichen des gesuchten Wortes sucht. Immer wenn ein weiterer Buchstabe gefunden wurde zählt er den "patterncounter" hoch wenn dieser dann in der IF genau gleich gross ist wie das CharArray des gesuchten Wortes, dann ist es das Wort und er zählt "patternexist" eines hoch. Das heisst OK es besteht nun einmal. Er sollte immer so weiter durchgehen und jedesmal wenn er das Wort identifiziert hat eins hochzählen.

Dies dann mit jeder der 3 Zeilen die übergebe ich aber separat.

Gruss


----------



## chri (30. Dez 2009)

[JAVA=25]
inputchararray[i+j]
[/code]
Es wird auf i+j zugegriffen, d.h es muss vorher geprüft werden ob es im gültigen bereich liegt.


[JAVA=27]
patterncount++;
[/code]
patterncount wird zwar hochgezählt aber nirgends zurückgesetzt.


----------



## Florian123 (30. Dez 2009)

Ok vielen Dank das mit dem zurücksetzen krieg ich hin, das mit dem Prüfen des gültigen Bereichs wie würdest du das anstellen?!

Grüsse


----------



## madboy (30. Dez 2009)

Wenn nicht mit char[] gearbeitet werden muss, könntest du dir die Sache sehr vereinfachen:

```
String[] split = input.split("\\s+");
for(String s : split)
{
  if(s.equals(pattern))
  {
    patternexist++;
  }
}
```


----------



## Florian123 (30. Dez 2009)

madboy hat gesagt.:


> Wenn nicht mit char[] gearbeitet werden muss, könntest du dir die Sache sehr vereinfachen:
> 
> ```
> String[] split = input.split("\\s+");
> ...



Können Sie mir erklären, was dies genau macht?!

Gruss


----------



## madboy (30. Dez 2009)

Erstens darfst du mich gern duzen 
und zweitens zählt der Codeschnipsel alle Vorkommen von pattern in input.


```
String[] split = input.split("\\s+"); //trennt input an Leerzeichen auf. "AB C" => {AB},{C}
```
Der Rest sollte eigentlich klar sein.


----------



## Florian123 (30. Dez 2009)

madboy hat gesagt.:


> Erstens darfst du mich gern duzen
> und zweitens zählt der Codeschnipsel alle Vorkommen von pattern in input.
> 
> 
> ...



Gut dann schon mal vielen Dank!


----------



## Florian123 (30. Dez 2009)

Ich habe noch eine 2te Aufgabe ich muss alle Leerzeichen löschen bis auf eines zwischen jedem Wort.
Habe das schon codiert aber geht das dann auch auf diese Weise einfacher wie du sie machst? und wie genau?


```
/************************************************************************
	* FUNCTION: DelSpaces													*
	*************************************************************************
	* Löscht die unnötigen Leerzeichen zwischen den Wörtern.				*
	************************************************************************/
	public static String DelSpaces(String input){
		
		int i = 0;
			
		input = input.trim();
		
		char [] chararray = input.toCharArray ();
		char [] chararray_new = new char[chararray.length];
			
		for (i = 0; i < chararray.length; i++){
			
			if (chararray[i] != ' ' || chararray[i+1] != ' '){
				
				chararray_new[i] = chararray[i];
					
				System.out.print(chararray_new[i]);
				
            }

		}
	
		//Variante 1: Chararray zurück in String
		//String output_str = new String(chararray_new);
					
		//Variante 1: Chararray zurück in String mit einer FOR Schleife abgefüllt
		String output_str = "";
		for (i = 0; i < chararray_new.length; i++){
			
			output_str = output_str + chararray_new[i];
			
		}

		return (output_str);
		
	}//DelSpaces
```


----------



## Florian123 (30. Dez 2009)

Florian123 hat gesagt.:


> Gut dann schon mal vielen Dank!



Komisch aber ich bekomme z.B in der ersten Zeile nur ein 1 zurück wenn pattern = "ist"!


----------



## madboy (30. Dez 2009)

Funktioniert bei mir...

```
public static void main(String[] args) {
      String input = "Das ist die erste ist Zeile";
      String pattern = "ist";
      int patternexist = 0;
      
      String[] split = input.split("\\s+");
      for(String s : split)
      {
        if(s.equals(pattern))
        {
          patternexist++;
        }
      }
      
      System.out.println(patternexist);
   }
```

Zur zweiten Aufgabe: ja, es geht einfacher. Diesmal aber keine Lösung sondern zwei Seiten zum Lesen. 
String (Java 2 Platform SE v1.4.2)
Pattern (Java 2 Platform SE v1.4.2)


----------



## Florian123 (31. Dez 2009)

Florian123 hat gesagt.:


> Ich habe noch eine 2te Aufgabe ich muss alle Leerzeichen löschen bis auf eines zwischen jedem Wort.
> Habe das schon codiert aber geht das dann auch auf diese Weise einfacher wie du sie machst? und wie genau?
> 
> 
> ...



Bei dem Leerzeichen löschen funktioniert meine Lösung grundsätzlich, doch wenn ich aus dem CharArray wieder ein String mache um es zurückzugeben ins Main, dann konvertiert er das ganz komisch in meinem Editor (Sc) sieht das dann so aus:

http://img509.imageshack.us/img509/8473/chararraytostring.jpg

Diese 3 komisch aber eigentlich richtig formatierten Zeilen kann er dann nicht richtig splitten und nach ist durchsuchen...

Gruss


----------



## madboy (31. Dez 2009)

hier solltest du erst prüfen, ob 
	
	
	
	





```
chararray_new[i]
```
 null ist und nur dann den Wert zu 
	
	
	
	





```
output_str
```
 hinzufügen wenn das nicht der Fall ist.

```
for (i = 0; i < chararray_new.length; i++){
            
            output_str = output_str + chararray_new[i];
            
        }
```


----------

