Anstatt 1 int Rückgabewert, mehrere Rückgaben mit Arraylist

Mofdesa

Mitglied
Hallo zusammen,

Ich habe 1 Klasse in der ich den KMP-Search Algorithmus implementiert habe. Dieser liefert die erste Fundstelle für ein Pattern als int zurück. Funktioniert auch soweit. Nun hätte ich allerdings gerne ALLE Fundstellen des Patterns zurückgegeben. Wollte hierfür die ArrayList benutzen. Nun funktioniert es manchmal. Wenn das Pattern allerdings vor der Stelle 3 gefunden wird, oder mehrmals vorkommt, funktioniert es nicht.

Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
	at java.lang.String.charAt(String.java:694)
	at Suchalgorithmen.kmpSearch(Suchalgorithmen.java:25)
	at Testprogramm.main(Testprogramm.java:33)

Ich verstehe nicht warum der Index mal passt und mal nicht. Kann mir jemand auf die Sprünge helfen? Vielen Dank!

Java:
public class Testprogramm{
	public static void main(String[] args) {
	System.out.print(Suchalgorithmen.kmpSearch("baaab", "b"));
}
}

public class Suchalgorithmen {
public static int kmpSearch (String text, String pat) {
		int[] next = initNext (pat);
		int i = 0, j = 0;
		while (i < text.length()) {
			while (j >= 0 && pat.charAt(j) != text.charAt(i))
			j = next[j];
			i++; j++;
			if (j == pat.length()) return i - pat.length();  //gefunden
			}
		
		return -1;//-1; // nicht gefunden
		}
	
	private static int[] initNext (String pattern) {
		int[] next = new int [pattern.length ()];
		int i = 0, j = -1;
		next[0] = -1;
		while (i < pattern.length() - 1) {
		while (j >= 0 && pattern.charAt(i) !=
		pattern.charAt(j))
		j = next[j];
		i++; j++;
		next[i] = j;
		}
		return next;
		}
}

Implementierung mit ArrayList
Java:
public static ArrayList<Integer >kmpSearch (String text, String pat) {
		ArrayList<Integer> gefundene_positionen_kmp = new ArrayList<Integer>();
		int[] next = initNext (pat);
		int i = 0, j = 0;
		while (i < text.length()) {
			while (j >= 0 && pat.charAt(j) != text.charAt(i))
			j = next[j];
			i++; j++;
			if (j == pat.length()) gefundene_positionen_kmp.add(i - pat.length());
			}
		if (gefundene_positionen_kmp.isEmpty()) return null;
		else return gefundene_positionen_kmp;
		}
 

njans

Top Contributor
Java:
       while (i < pattern.length() - 1) {
        while (j >= 0 && pattern.charAt(i) !=
        pattern.charAt(j))
        j = next[j];
        i++; j++;
        next[i] = j;

Was sollte j daran hindern über pattern.length -1 hin wegzugehen und dir dann deine Exception zu werfen?

Nebenbei: Bitte schreibe doch Java und nicht C, Java hat nämlich so seine Code Conventionen, welche sich auch leicht lesen lassen.
 

Mofdesa

Mitglied
Vielen Dank für deine Antwort. Ich verstehe deine Frage nicht wirklich. j wird doch nur mit 0 und pattern.charAt(i) verglichen.

Ich hatte mir das einfach so gedacht, dass anstelle der Rückgabe des int Wertes, dieser in die Liste geschrieben wird. Sonst will ich ja an der Arbeitsweise nichts ändern.

Was meinst du mit C und Java? Hab doch den Code in Java Tags gesetzt.
 

imillitay

Mitglied
Dadurch, dass du jetzt nach dem Fund einer Stelle weitermachst und das Programm nicht abbrichst, wird j weiter erhöht. Und was wird passieren, wenn j zuletzt genauso groß war wie die Länge des gesuchten Strings und dann noch um eins erhöht wird?

Bezüglich C und Java: njans meint vermutlich Variablennamen wie
Java:
gefundene_positionen_kmp
(Stichwort CamelCase)

Korrekte Einrückungen können den Code auch um einiges lesbarer machen.
 

Mofdesa

Mitglied
Pling. Der Groschen ist gefallen. Dann ist String nicht mehr in der Range und ich bekomme selbstverständlich meine Exception an der Stelle:

Java:
while (j >= 0 && pat.charAt(j) != text.charAt(i))

Richtig? Nun weiß ich schonmal wo das Problem liegt. Das ist sehr hilfreich, vielen Dank. Wenn ich jetzt j nur erhöhe, wenn die if-Bedingung nicht zutrifft, wäre das der richtige Weg?

Das mit den Variablennamen und den Einrückungen bitte ich an der Stelle zu entschuldigen. Bin nicht so fit in den Java Conventions.
 

imillitay

Mitglied
Dann hättest du immer noch das Problem, dass dein j irgendwann ins Unendliche schießt.
Denk daran, dass du, nachdem du ein Wort gefunden hast, an der nächsten Stelle im zu durchsuchenden String weitermachst und der Algorithmus beim Pattern wieder von vorne beginnen muss.
 

Mofdesa

Mitglied
Nochmals vielen Dank. Das habe ich heute auch gemerkt. ;-) Hätte nicht gedacht, dass das so schwierig wird.

Auf jeden Fall kriege ich das auf die Schnelle nicht gelöst und mir fehlt gerade die Zeit, um mich damit ausführlich zu beschäftigen. Werde da wohl Ende der Woche nochmal in Ruhe dran gehen. Kenne mich in Java noch nicht so gut aus, aber sowas wie Sprungpunkte gibt es ja auch sicherlich.
 

imillitay

Mitglied
So schwierig ist das denke ich nicht, bei mir hat eine weitere Anweisung gereicht und es lief (welche und wo verrate ich dir aber nicht :D )
Zumindest hat es drei kleine Tests von mir ueberstanden. Hier bietet sich uebrigens JUnit perfekt an, um mehrere Tests fuer deinen Algorithmus zu schreiben.
 

Mofdesa

Mitglied
Ist wahrscheinlich wie immer, wenn man es gelöst hat, war es eigentlich ganz einfach. ;-)

Will da schon selber drauf kommen, da bin ich ehrgeizig... Da ich ja jetzt grundsätzlich weiß, wo der Fehler liegt, bekomme ich das sicherlich auch hin. Aber jetzt fehlt mir gesagt die Zeit und ich bin "codeblind", wenn du verstehst was ich meine. ;-) War wohl ein wenig optimistisch zu denken, dass ich mich mal schnell in Java zurecht finde. :-D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R App soll selbstständig reagieren, anstatt via Models Java Basics - Anfänger-Themen 0
T jOptionPane zum schließen von Fenster, wie "Ja" und "Nein" anstatt Yes und No Java Basics - Anfänger-Themen 2
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
U buttonarray[this] anstatt buttonarray[index] ? Java Basics - Anfänger-Themen 12
J Array anstatt Begriffe als Indizes Java Basics - Anfänger-Themen 14
I Erste Schritte while anstatt for, if und break Java Basics - Anfänger-Themen 10
K Was benutzen anstatt this? Java Basics - Anfänger-Themen 9
K Polymorphie Objektreferenz als Superklasse anstatt des Objekttypes Java Basics - Anfänger-Themen 12
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
A POI Einlesen Excel Workbook aus BLOB oder von URL anstatt aus Filesystem ? Java Basics - Anfänger-Themen 3
P (Arbeitstag-) Calendar - 9 anstatt 24 Stunden Java Basics - Anfänger-Themen 12
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3
Horst79 Temp Datei cachen anstatt physikalische Datei im root Verz? Java Basics - Anfänger-Themen 8
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
S StringBuffer anstatt += Java Basics - Anfänger-Themen 8
C Servlets: doPost() etc. anstatt service() Java Basics - Anfänger-Themen 4
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
H private anstatt public Java Basics - Anfänger-Themen 2
C Wie kann ich Grichische Buchstaben ausgeben anstatt latein? Java Basics - Anfänger-Themen 2
M Ausgabe in String anstatt auf Stream Java Basics - Anfänger-Themen 17
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
B Rückgabewert boolean Java Basics - Anfänger-Themen 8
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
L Methoden Rückgabewert Verbergen / nicht mit ausgeben Java Basics - Anfänger-Themen 4
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
R Boolean Methode Rückgabewert if() Java Basics - Anfänger-Themen 1
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
F Pascalsches Dreieck mit Rückgabewert Java Basics - Anfänger-Themen 2
D Dezimal zu Dual mit Rückgabewert Java Basics - Anfänger-Themen 39
Curtis_MC Methoden Rückgabewert von BiPredicate Java Basics - Anfänger-Themen 6
B Array als Rückgabewert in der Methode Java Basics - Anfänger-Themen 1
T Rückgabewert Problem Java Basics - Anfänger-Themen 2
A Methoden Rückgabewert Java Basics - Anfänger-Themen 6
I Referenz auf Klasse als Rückgabewert Java Basics - Anfänger-Themen 7
H Variablen Void und der Rückgabewert Java Basics - Anfänger-Themen 6
P Rückgabewert bestimmen Java Basics - Anfänger-Themen 17
J Warum wird Array durch Methode ohne Rückgabewert verändert? Java Basics - Anfänger-Themen 5
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
I Rückgabewert einer Methode in anderer Klasse verwenden Java Basics - Anfänger-Themen 2
D for-Schleife Rückgabewert Java Basics - Anfänger-Themen 6
M Rückgabewert bei Methoden Java Basics - Anfänger-Themen 6
C Rückgabewert von Kontruktoren Java Basics - Anfänger-Themen 15
S Methoden Bei Liste als Rückgabewert: IndexOutOfBoundsException Java Basics - Anfänger-Themen 1
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
O Was verursacht den Rückgabewert false bei der Methode ready() eines BufferedReaders Java Basics - Anfänger-Themen 9
K Methode ohne Rückgabewert in boolean Methode ändern Java Basics - Anfänger-Themen 6
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
S Rückgabewert null in Methode mit Thread Java Basics - Anfänger-Themen 2
N Klassen constructor Rückgabewert Java Basics - Anfänger-Themen 10
C Methoden Rückgabewert von statischer Methode ignorieren Java Basics - Anfänger-Themen 8
MiMa Methode mit Rückgabewert Java Basics - Anfänger-Themen 2
feardorcha Methodenaufruf Übergabe- und Rückgabewert Java Basics - Anfänger-Themen 5
T Variablen Rückgabewert aus einer Schleifen-Methode Java Basics - Anfänger-Themen 8
D Methode mit Rückgabewert Java Basics - Anfänger-Themen 5
K Rückgabewert einer Klassenmethode Java Basics - Anfänger-Themen 7
J Methoden mit und ohne Rückgabewert Java Basics - Anfänger-Themen 22
D Erste Schritte Als Rückgabewert Klasse Java Basics - Anfänger-Themen 5
D Rückgabewert Pixelgrabber Java Basics - Anfänger-Themen 3
S ArrayList und Rückgabewert Java Basics - Anfänger-Themen 2
T Methode - Rückgabewert Schreibweise Java Basics - Anfänger-Themen 6
S Interface Rückgabewert Java Basics - Anfänger-Themen 3
F if Anweisung mit Rückgabewert? Java Basics - Anfänger-Themen 4
I Rückgabewert von JSlider Java Basics - Anfänger-Themen 15
B Methoden, Rückgabewert und Verknüpfungen Java Basics - Anfänger-Themen 15
V OOP Klassen Methoden Rückgabewert Java Basics - Anfänger-Themen 15
C Datentypen Rückgabewert von "new FileInputStream" Java Basics - Anfänger-Themen 4
S Datentypen String mit fester Länge (Rückgabewert einer Methode) Java Basics - Anfänger-Themen 2
O Rückgabewert mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 10
G List als Rückgabewert einer rekursiven Methode (Baum) Java Basics - Anfänger-Themen 3
T Array als Rückgabewert einer Methode Java Basics - Anfänger-Themen 3
A Rückgabewert ändert sich? Java Basics - Anfänger-Themen 9
C Thread mit Rückgabewert? Java Basics - Anfänger-Themen 4
S Rückgabewert einer Instanzvariable Java Basics - Anfänger-Themen 2
K rückgabewert combobox Java Basics - Anfänger-Themen 15
M Methoden mit Rückgabewert Java Basics - Anfänger-Themen 4
B Vector<Point> als Rückgabewert Java Basics - Anfänger-Themen 23
C Null als Rückgabewert Java Basics - Anfänger-Themen 7
O String[] Array als Rückgabewert Java Basics - Anfänger-Themen 7
G setValueAt Rückgabewert verarbeiten? Java Basics - Anfänger-Themen 12
P Methode mit 2 unterschiedlichem Rückgabewert Java Basics - Anfänger-Themen 10
L Prozess rückgabewert? Java Basics - Anfänger-Themen 5
I "Rückgabewert" von EditorFenster Java Basics - Anfänger-Themen 6
A ActionPerformed Methode ohne Rückgabewert Java Basics - Anfänger-Themen 12
G Rückgabewert bei JInternalFrame ? Java Basics - Anfänger-Themen 2
M Rückgabewert Java Basics - Anfänger-Themen 4
L Rückgabewert Java Basics - Anfänger-Themen 7
K Frage zu Rückgabewert List und ArrayList Java Basics - Anfänger-Themen 6
D Methode aufrufen funktioniert nicht ganz - Rückgabewert Bool Java Basics - Anfänger-Themen 12
M Rückgabewert einer Methode Java Basics - Anfänger-Themen 6
P Array als Rückgabewert Java Basics - Anfänger-Themen 4
halla Array an Methode übergeben / Array als Rückgabewert Java Basics - Anfänger-Themen 2
L Rückgabewert in Konstruktor? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben