Suchen von Wörtern in einem Text

Status
Nicht offen für weitere Antworten.

sirius1010

Mitglied
Hi,

ich hab ein kleines Problem mit dem Vergleichen von Strings!
ICh möchte gern aus einem Text, den ich per Datei einlese die Häufigkeit eines Wortes ausgeben, das ich über die Tatur eingebe!
Eingabe und ausgabe funktioniert schon ganz gut, einziges Problem bis jetzt findet er nur die wörter, die seperat stehen, am anfang und am ende! und die groß und kleinschreibung wird beachtet, leider!
Wie bekomm ich es am besten hin, dass er auch wörter findet die in einem wort "gefangen" sind?
also ich hab z.B. den Text:

"user userlist neuuser neuuserlist"

wenn ich dann nach "user" suche gibt er an es sei nur 3 mal vorhanden!

Code:
import java.io.*;
import java.util.*;
public class probe extends Environment {

		public static void main(String[] args) {
			probe pn = new probe();
			pn.mainProgram(args);
		}
		
			
	void mainProgram(String[] args) {
		
		
			int anzahl=0;
		    int position = 0;
			String zeile= null;
		    String wort = new String();
		    String token;
		    FileReader text;
		    BufferedReader tippen;    //eingabepuffer fuer Suchbegriff
		    BufferedReader eingabe;   //eingabepuffer fuer datei
		    
				try {
				//Eingabe des Suchbegriffs	
				tippen = new BufferedReader(new InputStreamReader(System.in));
				System.out.print("Suchbegriff: ");
				wort = tippen.readLine();
				char[] suchbegriff = wort.toCharArray();
				
				//Einlesen der Datei zur Suche	
				File Datei = new File("datei.txt");
				text = new FileReader(Datei);
				eingabe = new BufferedReader(text);
				zeile =eingabe.readLine();
				
				//solange datei noch zeichen enthält
				while (zeile != null){
				
				//Aufteilung der Zeichenkette in Token "Leerzeichen" dabei als Trennzeichen	
				StringTokenizer string = new StringTokenizer(zeile," ");
				
				while (string.hasMoreTokens()){  //solange Token weitere Token vorhanden
				
					token = string.nextToken();  //gehe zum nächsten Token
					if (token.startsWith(wort))  //Token beginnt mit Suchwort, dann erhöhe anzahl
					anzahl++;
					else {
						if (token.endsWith(wort)) //Token endet mit Suchwort, dann erhöhe anzahl
								anzahl++;
			
					}
				
				zeile = eingabe.readLine();
				}
			  }
			//Ausgabe des Ergebnisses	
			System.out.println("Das wort " +wort+ " wurde " +anzahl+ " mal gefunden!");
				
			eingabe.close();
				
			} catch(IOException e)
			 {
			 System.out.println("Bitte geben sie keine Sonderzeichen ein");
			 }
			 catch(NoSuchElementException e)
			 {
			 System.out.println("Bitte geben sie einen Suchbegriff ein!");
			 }
			
      }
}


Danke für ein paar tipps!
 
Eigentlich ganz einfach (solange Du nicht auf die Performance achten musst). Es gibt eine tolle Methode indexOf auf dem String und mit dem kannst Du Strings suchen bis es keine mehr zu finden gibt.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#indexOf(java.lang.String,%20int)

Wenn Du den gesamten Text dann noch Uppercase machst und den Suchbegriff auch (toUppercase), dann sollte Dein Problem lösbar sein. (Für ne Schulaufgabe ausreichend)

Sollte das Ganze auch noch schnell laufen und produktiv genutzt werden, so verwendet man am besten regular expression (im JDK 1.5 mit drin oder http://jakarta.apache.org/regexp/index.html).
 
sirius1010 hat gesagt.:
"user userlist neuuser neuuserlist"

wenn ich dann nach "user" suche gibt er an es sei nur 3 mal vorhanden!
ist ja klar das der das nur 3 mal findest denn du guckst immer nur ob ein wort mit user anfängt oder aufhört aber nicht ob es irgendwo mitten drin ist
 
ja genau, das meinte ich damit auch, dass ich wie man das wort in der mitte findet, ich versuchs mit indexOf mal, bis jetzt klappts noch nicht so ganz...aber er findet schon mehr, eher zuviel 🙂
 
hab das mal mit indexOf zusammengesbastelt, sieht vielleicht bissel komisch aus aber so gehts auf jeden fall:

Code:
//solange datei noch zeichen enthält
				while (zeile != null){
				//Aufteilung der Zeichenkette in Token "Leerzeichen",".", "/" und "()" dabei als Trennzeichen	
				StringTokenizer string = new StringTokenizer(zeile," ,./()");
				while (string.hasMoreTokens()){  //solange Token weitere Token vorhanden
				
					token = string.nextToken();  //gehe zum nächsten Token
					if (token.startsWith(wort))  //Token beginnt mit Suchwort, dann erhöhe anzahl
					anzahl++;
					else {
						if (token.endsWith(wort)) //Token endet mit Suchwort, dann erhöhe anzahl
								anzahl++;
					
						else {
				 pos = token.indexOf(suchbegriff[0]);
			 if (pos > -1 && token.length() >= wort.length()+pos) 
		
		    token = token.substring(pos,wort.length()+pos);
		  if (token.equals(wort))
			 anzahl++;
			 }
					}
					zeile = eingabe.readLine();
				}
			 }
				
			//Ausgabe des Ergebnisses	
			System.out.println("Das wort " +wort+ " wurde " +anzahl+ " mal gefunden!");
				
			eingabe.close();

kann man das als okay definiern oder gibts da vielleicht ne bessere methode? Aber ich würde gerne IgnoreCase mit reinbringen, für groß und kleinschreibung aber das funzt nciht so wie es soll und mit toUpperCase gehts irgendwie auch nicht so das was sinvolles bei rauskommt. *grübel*
 
also ich möchte ungern deine hausaufgaben machen, aber durchdenke doch bitte deinen code (mal ein diagramm) bevor du codierst! den spass mit endsWith und startsWith lässt du am besten ganz weg. dann verwendest du eine while schleife, welche solange läuft, wie das wort im string enthalten ist (pos > -1). und das indexOf rufst du natürlich immer ab der letzten gefundenen position + 1 auf (ich hoffe jetzt hab ich keinen denkfehler :roll: ).

und versuch auch noch mit

Code:
wort = wort.toUppercase();
token = string.nextToken().toUppercase();

so ich hoffe das hilft weiter.
 
also das mit touppercase funzt gar nicht, weil nur ändern der Buchstaben von klein in groß bringt mir ja nicht viel! hab auch schon versucht nur einzelne Buchstaben zu änderen aber das klappt dann nicht mehr mit dem vergleichen.
ganz ohne startsWith und endsWith gehts nicht...

Code:
ndex = token.indexOf(suchbegriff[0]);				 
while (index > -1 && token.length() >= wort.length()+index){
					token = token.substring(index,wort.length()+index); 
		 			if (token.equals(wort))              
					    anzahl++;              
				 }

oder hab ich da mal wieder was völlig verdreht oder ganz falsch eingebracht?:roll:
 
Am besten du liest dich mal in RegEx ein, dann gibts auch so tolle Sachen wie
CASE_INSENSITIVE
Mit dem Tokenizer würd ich gar nicht anfangen, da RegEx wesentlich mächtiger sind, und man sich das früher
oder später sowieso aneignen muss.
 
So programm läuft jetzt und sogar mit toUpperCase...manchmal braucht man eben etwas länger!
Danke an alle die geholfen haben!
 
Hi

ich möchte einen String vom Programm untersuchen lassen, ob er eine spezielle Formatierung hat.
Das Programm soll nämlich erkennen ob der eingegebene String ein Wort oder
ein Datum mit dem Format: ##.##.#### ist. #steht für eine beliebige Zahl.
Wie kann ich das am einfachsten programmieren.


Mfg
 
if(str.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}"))--->datum
Oder:
if(str.matches("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}"))---> datum
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben