Gepostet: |
Vorkommen einer Liste in einer anderen Liste finden | ||||||||||
Hallo zusammen, ich möchte bzw. muss eine Funktion schreiben die folgendes tut ich habe eine "Liste" ["AAbbbbbbbbAAbbbbbbbAA"] und eine Liste ["AA"] nun möchte ich die genauen Positionen vom Vorkommen von Liste 2 in 1 finden also [1,11,20] soll das Ergebniss sein. in php würde mb_strpos etwas ähnliches tun. Meine Frage Gibt es evtl bereits eine Funktion in Haskell die soetwas macht oder wenn nicht, wäre ich über einen Tip wie ich die Sache angehen kann dankbar. Ich hab vorher schon eingen anderen Programmiersprachen programmiert. Da wäre eine solche Aufgabe in ein paar Minuten gelöst. Hier sitze ich allerdings schon seid ein paar Stunden mit wachsendem frust dran. Wäre also nett, wenn mir jemand auf die Sprünge helfen kann. Gruß |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, ich habe die Lösung falls es jemanden intressiert oder so exactmatch::(Eq a)=>[a]->[a]->[Int] exactmatch x y = kram 0 (take (length x) x) (take (length y) y) where kram a [] c = [] kram a b c = if take (length c) b == take (length c) c then [a+1]++ kram (a+1) (drop 1 b) c else [] ++ kram (a+1) (drop 1 b) c |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
als Listenkomprehension siehts etwas übersichtlicher aus :) exactmatch :: (Eq a) => [a] -> [a] -> [Int] exactmatch a b = let v = (length b) in [ (i+1) | i <- [0..((length a) - v)] , b == (take v (drop i a))] ich geh dabei davon aus, dass deine zwei Listen an sich Strings (also Listen aus Chars) sind also a = "AAbbbbbbbbAAbbbbbbbAA" b = "AA" hoffe das ist der Aufgabe entsprechend |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ich hätte da mal ne Frage.... Das Programm von dir funktioniert wunderbar, aber ich versteh nicht wirklich was bei der Programmzeile exactmatch a b = let v = (length b) in [ (i+1) | i <- [0..((length a) - v)] , b == (take v (drop i a))] eigentlich passiert. Wäre nett, wenn mir das jemand erklären könnte: Danke. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo,exactmatch a b = let v = (length b) v erhält erstmal die Länge von b. i durchläuft dann alle Werte in der Liste [0..((length a) - v)], also alle Zahlen von 0 bis (Länge von a) - v. Dann wird geprüft, ob der Substring der Länge v beginnend an Position i im String a gleich b ist und falls ja, dann wird (i+1) in die Ergebnisliste aufgenommen, sonst nicht. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||