Muster erkennen

Yasemin bahar

Mitglied
Hallo!
Ich habe eine Aufgabe bekommen, habe versucht die zu lösen, aber komme leider nicht mehr voran.
Die Aufgabe besagt, dass zwei Texte in String gegeben sind z.B String Text= "bananeananas" und String Muster= "ana". Nun muss ich dafür sorgen, dass mein Programm erkennt, dass das Wort in dem Text enthalten ist. Zudem muss ich ein Ergebnisarray angeben, welches alle gefundenen Musterbeginne sammelt und in einem Array zurückgibt.
Beispiel: bananeananas, ana -> [1,6,8]
Ich wäre dankbar, wenn ihr mir helfen würdet!
LG
(Im Anhang befindet sich mein bisheriger Java Code)
 

Anhänge

Kannst du es denn "per Hand" lösen? Also, was würdest du machen, wenn du ohne zu porgrammieren sagen sollst, ob und an welchen Stellen "ana" in "bananeananas" vor kommt?


Code bitte immer direkt als Code in Code-Tags posten, nicht als Datei anhängen (außer die Länge erfordert es, aber dann ist es üblicherweise sowieso zu viel für eine Frage).
 
Die Idee ist grundsätzlich absolut in Ordnung.
Zwei Fragen zur Aufgabe:

1. Würde "anana" den Begriff "ana" laut Aufgabe zwei mal enthalten oder nur einmal? Davon hängt ab, ob du beim Suchen immer nur um index +1 weitergehst, oder ob du - falls ein Muster gefunden wird - eine gewisse Anzahl an Zeichen (entsprechend der Musterlänge) überspringst.

2. Dürft ihr auch höhere Funktionen verwenden oder muss das Ganze auf chars basieren? Für die Suche gibt's nämlich eine recht nette vorgefertigte Hilfsfunktion.

Tip: Da du nicht im Vorfeld weißt, wie oft das Muster im Wort vorkommt, solltest du deine Teilergebnisse (Indizes, an denen das Muster gefunden wurde) erst mal in einer Liste speichern. Die kannst du später immer noch in ein Array umwandeln.
 
Zu der ersten Frage: Du liegst richtig, dass Wort ana liegt dann zweimal vor und darf dann dementsprechend nicht einfach die Länge des Musters überspringen.
Zu der zweiten Frage: Das ist ne gute Frage, in der Aufgabenstellung ist keine konkrete Bedingung gegeben, also könnte man theoretisch beide Variante verwenden.
Danke für den Tipp, vielleicht hilft mir dies weiter, ich versuche es mal!
 
[CODE lang="java" title="Muster"] public static void main(String[] args){

//String dekladieren
String text = "bananeananas";
String muster = "ana";
System.out.println(findPattern(text, muster));

}
private static int[] findPattern(String text, String pattern) {
int[] arr = new int [5];
for(int i=0;i<= text.length();i++) {
int u =text.indexOf(pattern);
arr = text.indexOf(pattern);
return arr;

}
return arr;



}
}[/CODE]

Ich habe es mit dem indexOf versucht und tatsächlich bekomme ich die Stelle eins raus. Allerdings habe ich das Problem, dass ich nicht weis wie ich entlang meinem String fortfahren muss und den Wert in Array übergebe. (Wir müssen eine Methode schreiben, deshalb ist meinem Code eine Methode)
 
Und ich würde empfehlen, sich immer den Algorithmus richtig vorzustellen und aussagekräftige Namen zu verwenden.

Was ist in deinem i? Was ist das u? Und was soll in den jeweiligen Arrays sein?

Und dann immer erst genau überlegen, was getan werden soll. Vergiss dabei Java ... sag es erst einmal in eigenen Worten!

Um es an Deinem Code deutlich zu machen:
a) dein i ist dubios. Du hast da ein Array arr, das wohl das Ergebnis e ärgsten soll ... Und dann hast du eine Schleife die über etwas anderes zählt und somit wäre eine IndexOutOfBoundsException vorprogrammiert ...
b) aber die Schleife ist ja so zum Glück keine Schleife. Das ist ja ein zähle bis ... Und bricht direkt sofort ab (Return in der Schleife).

Daher: überlege Dir, wie Du es einem anderen erläutern kannst ... der weiss nichts ... ich habe also zwei Worte auf einem Zettel und soll fest stellen, wie oft das zweite im ersten ist...

Dabei ein Tipp: bleibe ruhig auf einem hohen Level. Es ist also in Ordnung zu sagen: Prüfe ob Zahl x in dem Array mit Zahlen y[] enthalten ist.
Und die grobe Anweisung verfeinert du dann separat. Das wäre dann bei der Umsetzung z.B. eine Methode. So hast du dann eine Unterteilung eines komplexen Sachverhaltes in viele kleine und du erhält einfach lesbaren Code.
 
Onixee hat den wichtigsten Teil der Lösung eigentlich eh schon geschrieben. Bei indexOf kannst du ein Offset mitgeben, ab welchem gesucht werden muss. Wenn du z.B. an Index 2 ein Muster gefunden hast, suchst du danach ab Index 3 weiter.

Du machst das so lange, bis kein Muster mehr gefunden wird (Rückgabewert -1) oder das nächste Offset zu hoch werden würde (außerhalb des Strings).

Was die Rückgabe angeht, hast du übrigens einen Denkfehler drin: du gehst davon aus, dass es 5 Rückgabewerte gibt. Aber sind es denn garantiert 5? Können es weniger sein? Dann werden die hinteren Felder mit 0 befüllt sein. Können es mehr sein? Dann ist das Array zu klein.
Wenn es eine unbestimmte Anzahl an Werten gibt, bietet sich das Arbeiten mit einer Liste an (die kannst du später immer noch umwandeln).

Ich empfehle, die Rückgabe erst mal zu ignorieren, lass die gefundenen Indizes einfach ins Log ausgeben. Sobald rauskommt, was du haben willst, machst du dir Gedanken darüber, wie man das Rückgabearray erstellt. Ein Problem nach dem anderen.
 
[CODE lang="java" title="Muster" highlight="14"]public class Muster1 {
public static void main(String[] args){

//String dekladieren
String text = "bananeananas";
String muster = "ana";
int[] arr = new int [text.length()];
if(text == muster ) {
System.out.println("Es handelt sich um das gleiche Wort!");
} else if(text != muster) {
for(int i=0;i<text.length();i++) {

System.out.print((arr=text.indexOf(muster,i))+ " ");
// Ausgabe 1 1 6 6 6 6 6 8 8 -1 -1 -1
}


}

}

}
[/CODE]
Habe jetzt mit den ganzen Tipps weitergearbeitet und habe nun ein kleines Problem. Die Werte kommen mehrfach vor. Wie kann ich das verhindern?
 
Hast Du dir denn einmal genau überlegt, wie dieses indexOf funktioniert?

Stell Dir das einfach einmal bildlich vor: Du stehst am Anfang eines Weges, der Markierungen an der Seite hat und auf dem Münzen liegen. Und dann fragst Du an Markierung 0: Wo liegt das nächste Geldstück? -> An Markierung 7
Ok, Du merkst Dir die Markierung 7. Und gehst eine Markierung weiter (bist damit auf 1) und fragst: "Wo liegt das nächste Geldstück?" -> An Markierung 7 ...

Wenn Du das Geldstück auf der 7 gefunden hast: Ab wo suchst Du denn dann weiter nach Geldstücken?
 
Mit anderen Worten: Schmeiß die for-to Schleife raus und asuche immer ab dem letzten gefundenen Index +1.

ps: "text == muster" = ganz schlechte Idee
("a"+"b") == "ab" wird false ergeben, obwohl die Texte gleich sind.
Strings und andere Objekte werden mit equals verglichen.
 

Zurück
Oben