Hallo,
ich möchte eine groessere Anzahl von Strings ( ~20.000) nach vorher festgelegten Regeln durchsuchen, z.B.
"Gib mir alle Strings die x Zeichen lang sind und zwei 'E' und 3 'A' enthalten".
Da diese Suchfunktion innerhalb des Programmlaufes mehrfach vorkommt, ist ein
iterieren üper alle collection strings zu langsam.
Ich dachte daher an eine Keyerzeugung für Hashtables während des Programmstarts, um dann schnell auf die einzelnen Gruppen zugreifen zu können.
Bsp: "AHA" -> 03A2H1
Funktioniert leider nicht, da es natürlich mehrere x Zeichen lange Wörter mit zwei 'E' und 3'A' geben kann und dann keys doppelt sind.
Es fehlt mir also eine Hashtable die duplicate keys erlaubt.
bis dann,
MaxMeise
Geschachtelte Collection
Obere Collection enthält nur den Key und als Value eine ArrayList
In der ArrayList sind dann die Werte welche auf den Key mappen
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Ich habe eine StringSearchDictionary-Klasse geschrieben. Die erlaubt die Suche mit Wildcards (*, +, ?, ., {m,n}). Man kann auch eine Liste mit Zeichen angeben, auf die die Suche eingechränkt werden soll, allerdings nicht so wie du es brauchst.
Beispiel:
StringSearchDictionary dict = new StringSearchDictionary(stringColl);
IList resultList = dict["ab*nen"];
dict.Remove("ab*nen+");
Intern basiert das Ganze auf einer Baumstruktur. Jedem Baumknoten ist ein Zeichen zugeordnet. Ein String als Schlüssel definiert mit seinen Zeichen einen Pfad in den Baum. Im letzten Knoten des Pfades ist der Wert zum Schlüssel abgelegt. Diese Art von Baum eignet sich besonders gut für Wildcard-Suchen. Sie wird häufig in elektronischen Wörterbüchern eingesetzt.
Wenn dir die Klasse was nützt, kann ich sie heute abend mal online stellen. Sie ist auf jeden Fall sehr schnell. Suchen in 20.000 Begriffen erfolgt ohne spürbare Zeitverzögerung, selbst wenn die Ergebnisliste gross ist.
Gruss
Pulpapex
Nein,
ich habe den Aufbau oben angedeutet, kein B-Baum. Laut Wikipedia nennt sich das Trie-Baum.