Hi.
Also ich denke Kiffi sucht nicht nach einer Möglichkeit rauszufinden ob sein Suchbegriff einem Text (den Listeneinträgen) ähnlich ist, sondern ob der Suchbegriff oder die "Untermenge des Suchbegriffs" bzw. "alle möglichen kürzeren Teile des SUchbegriffs" darin vorkommen.
Da ich in Kürze was ähnliches Brauche für meine DorfMap habe ich mal grob folgendes gebastelt:
Code: Alles auswählen
; ;http://www.purebasic.fr/german/viewtopic.php?t=17752
Global NewList TextListe.s()
Structure struct_gefunden
*pointer
SuchString.s
EndStructure
Global NewList Gefunden.struct_gefunden()
For i = 1 To 10 ; einfach mal schnell ne Liste erstellen in der gesucht werden kann.
AddElement(TextListe())
TextListe() = "123bubuxyz" + ("_") + Str(i)
AddElement(TextListe())
TextListe() = "123ubuxyz" + ("_") + Str(i)
AddElement(TextListe())
TextListe() = "123bubuxyz" + ("_") + Str(i)
AddElement(TextListe())
TextListe() = "123bubxyz" + ("_") + Str(i)
Next i
Procedure Search2(SuchString.s)
ResetList(TextListe())
ForEach TextListe()
Position = FindString(TextListe(), SuchString, 1)
If Position > 0
AddElement(Gefunden())
Gefunden()\pointer = @TextListe()
Gefunden()\SuchString = SuchString
;Debug Str(Gefunden()\pointer) + ":" + Gefunden()\SuchString
EndIf
Next
EndProcedure
Procedure Search(SuchString.s)
ClearList(Gefunden())
SuchStringCopy.s = SuchString
For teillaenge = Len(SuchString) To 1 Step -1
For pos = 1 To (Len(SuchString)-teillaenge)+1
Search2(Mid(SuchString, pos, teillaenge))
Next
Next
EndProcedure
Procedure ClearSearch()
; ResetList(Gefunden())
SortStructuredList(Gefunden(), #PB_Sort_Ascending , OffsetOf(struct_gefunden\pointer), #PB_Sort_String)
ForEach Gefunden()
If Gefunden()\pointer = *OldPointer
DeleteElement(Gefunden() )
EndIf
*OldPointer = Gefunden()\pointer
Gefunden()\SuchString = ""
Next
EndProcedure
Search("bubu")
ClearSearch() ; falls nicht interessiert welcher Teilstring zum erfolg führte, so kann man hiermit alle doppelten Einträge löschen.
ForEach Gefunden()
ChangeCurrentElement(TextListe(), Gefunden()\pointer)
Debug Str(Gefunden()\pointer) + " : " + Gefunden()\SuchString + " : " + TextListe()
Next
Delay(10000)
Ist noch nicht so groß getestet, da ich keinen Bock hatte mir hunderte verschiedene Listeneinträge einfallen zu lassen

sollte aber an sich laufen.
Eine Liste beinhaltet die Texte die durchsucht werden sollen, die zweite Liste beinhaltet die Pointer auf die Einträge der ersten Liste in welcher der Suchbegriff (oder Teil davon) vorkommt. Es kann dabei zu Mehrfacheinträgen in der Ergebnissliste kommen, was aber sinnvoll sein kann, wenn man sehen möchte zu welchem Suchbegriff / Suchteil was gefunden wurde (mit Einen Durchlaufe und einer If-Abfrage oder der Sortierungsfunktion kann man die Ausgabe formatieren).
Mit "Clearsearch" kann man die Ergebnissliste schnell aufräumen und es wird jeder Pointer nur noch einmal vorkommen. Man weiß also schnell in welchen Einträgen gefunden wurde.
Die Suche sollte mit jeder Suchwortlänge zurechtkommen. Nur "Leerstrings" könnten Probleme bereiten, da ich da noch keine Sicherheitsabfragen drinn habe.
Ein bissl optiert und angepaßt werden muß also noch.
Ich hoffe es klappt.
Nachtrag:
Für die meißten fälle dürfte das schnell genug sein. erhöht man die Listeneinträge im Beispiel auf 10 000 EInträge so dauert es bei mir ca. 3 Sekunden. Ohne "clearsearch" ne halbe. Das heißt optimieren kann was bringen.
wenn man z.B. ZUERST nach dem Vorkommen der einzelnen Buchstaben schaut (also umgekehrte Suchreihenfolge) und in bestimmten EInträgen diese nicht findet, so kann mana ausschließen das sich längere Suchwörter da drinn befinden und braucht dort nicht mehr zu suchen. Dadurch würde die Suche im Durchschnitt viel schneller gehen. Falls es aussreicht zu wissen ob in einem Eintrag überhaupt ein Suchwortteil vorkommt kann man nach dem ersten Fund ebenfalls diesen Teil aus der Suche rausnehmen (also z.B. in der TExtliste den EIntrag löschen).
Ich denke dem Code läßt sich noch in Bezug auf Tempo um einiges optimieren. Aber das wollte ich nicht machen, denn ich weiß nicht wozu es genau benötigt wird.
Gruß
Toshy
1. Win10
PB6.1