textdatei lesen

3abd

Grünschnabel
Hallo zusamen
ich habe ein Algorithmus Boyer Moore in java der lauffähig ist. für den text Eingabe möchte ich nicht immer manuell eingeben, sondern nur als textdatei der mir halt liest und vergleicht mit Muster das ich möchte. Hat jemand eine Idee vielen dank im Vorraus :D
den Code sieht so aus:
import java.util.Map;

Java:
 public class BoyerMoore {
 	public static List<Integer> match(String pattern, String text) {
 		List<Integer> matches = new ArrayList<Integer>();
 		int m = text.length();
 		int n = pattern.length();
 		
 
 		Map<Character, Integer> rightMostIndexes = preprocessForBadCharacterShift(pattern);
 	
 		int alignedAt = 0;
 		while (alignedAt + (n - 1) < m) {
 
 			for (int indexInPattern = n - 1; indexInPattern >= 0; indexInPattern--) {
 				int indexInText = alignedAt + indexInPattern;
 				char x = text.charAt(indexInText);
 				char y = pattern.charAt(indexInPattern);
 
 				if (indexInText >= m)
 					break;
 
 				if (x != y) {
 
 					Integer r = rightMostIndexes.get(x);
 
 					if (r == null) {
 						alignedAt = indexInText + 1;
					}
 
 					else {
 						int shift = indexInText - (alignedAt + r);
 						alignedAt += shift > 0 ? shift : 1;
 					}
 
 					break;
 				}
 				else if (indexInPattern == 0) {
 					matches.add(alignedAt);
 					alignedAt++;
 				}
 
 			}
 		}
 		return matches;
 	}
 	private static Map<Character, Integer> preprocessForBadCharacterShift(
 			String pattern) {
 		Map<Character, Integer> map = new HashMap<Character, Integer>();
 		for (int i = pattern.length() - 1; i >= 0; i--) {
 			char c = pattern.charAt(i);
 			if (!map.containsKey(c)) map.put(c, i);
 		}
 
 		return map;
 	}
 	public static void main(String[] args) {
 		List<Integer> matches = match("abb", "bacbabcababcabb");
 		for (Integer integer : matches) System.out.println("Match at: " + integer);
 		System.out.println((matches.equals(Arrays.asList(1, 3)) ? "OK" : "Failed"));
 
 	}
 }
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

bitte beschreib dein Problem genauer.
Hab keine Ahnung, was du willst.
 
Moin und auch von mir ein Herliches Willkommen ^^

Wo ist denn das Problem? Du musst doch dann einfach nur eine Datei einlesen und den eingelesenen Inhalt an die Methode match übergeben.
 
Hi sheel,
Wie man sieht ganz unten ich habe Muster : abb und Text : bacbabcababcabb ich möchte halt eine methode implementieren, die mir egal welchen Textdatei ich habe und bis 2 Gb groß ist, mit mein Muster abb vergleichen kann und schaue, ob da ein match gibt oder nicht
d.h. ob "abb" in diesem Text vorkommt oder nicht.
 
Und wo ist dabei das Problem oder die Schwierigkeit?
Akeshihiro hat gesagt.:
Du musst doch dann einfach nur eine Datei einlesen und den eingelesenen Inhalt an die Methode match übergeben.
Einfach eine Methode implementieren, die die Datei stumpf einliest und den Inhalt zurückgibt. Den übergibst du dann an deine Methode und gut is.

Ich hab ein bisschen das Gefühl, dass du gar nicht weißt, wie man mit Dateien arbeitet oder?
 
Hi Akeshihiro,
ich habe keine Ahnung.
ich habe´s versucht mit BufferReader und anderen Methoden aber wie ich das um setze konnte ich nicht, deswegen bitte um die Hife
 
(Hab die PN bekommen, aber du kannst ruhig im Thread weiterschreiben)

Also...Eine Datei einfach nur einlesen dürfte mit "Filestream Java" in Googe nicht so schwer fallen.

2GB kannst du aber nicht in einem Stück einlesen, um die Datei als String zu haben.
Auch, wenn du den GC danach manuell leerst (was nicht unbedingt empfehlenswert ist,
falls Java das überhaupt mitmacht).
(Und nein, nur weil man 4GB RAM hat, bekommt Java davon nicht automatisch alles.).

Du musst dein match so umschreiben, dass es immer einen Teil der Datei im Speicher hat,
und bei Bedarf den nächsten Block einliest.

Und was ist mit Userzeit/Systemzeit?
Wenn du die Dauer berechnen willst, musst du nur
-Am Anfang die Zeit ermitteln
-am Ende die Zeit ermitteln
-Subtrahieren.

PS:
@Akeshihiro: Laut PN ist die Datei 2GB groß,
sollte also mit einem Schritt problematisch werden.
@3abd: Bitte Forumsuche und Google.
Es gibt so viele Seiten, auf denen das schon ausführlich erklärt ist.
 
Mit user zeit und system zeit ist Cpu zeit, damit ich eine genau zeit der bearbeitung bekomme ohne nebenläufige prozesse die die CPU zeit beeinträchtigen.
 
Ich bemühe mich die frage richtig zu stellen.kann man was mit
cpuStart = threadMX.getCurrentThreadCpuTime();
userStart = threadMX.getCurrentThreadUserTime();
was anfangen?
komme ich nicht weiter
danke im Vorraus!
 
Zurück