Probleme in sortierter, duplikatloser StringList mit 'ss' bzw. 'ß'
-
Hallo zusammen,
was muss ich in nachfolgendem Code ändern, damit sowohl 'muss' als auch 'muß' sowie 'kuß' als auch 'kuss' in die Liste aufgenommen wird?
Die StringList enthält nach dem Hinzufügen der Strings lediglich zwei Einträge, nämlich 'muss' und 'kuß'.
TStringList* sl = new TStringList(); sl->Sorted = true; sl->Duplicates = false; sl->CaseSensitive = false; sl->Add("muss"); sl->Add("muß"); sl->Add("kuß"); sl->Add("kuss"); ListBox_Debug->Items->Add("Anzahl StringList-Elemente: " + IntToStr(sl->Count)); ListBox_Debug->Items->AddStrings(sl); sl->Free();
Gruß
Leo
-
Hallo
Anscheinend ist die Sortierung dafür verantwortlich, wenn ich CaseSensitive und Duplicated auskommentiere werden auch 2 Einträge verschluckt. Kommentiere ich dagegen Sorted aus, dann sind alle 4 Einträge da.
Die Hilfe sagt dazu :
Wenn Sorted auf true gesetzt ist, werden die Strings mit der Methode AnsiCompareStr sortiert. Diese Sortierreihenfolge berücksichtigt die lokalen Einstellungen des Systems, auf dem die Anwendung ausgeführt wird.
Da zumindestens in meinem BCB 5 sich die Suchfunktion nicht ändern läst, sehe ich da nur die Möglichkeit die StringList-Suche auszuschalten und eine eigene zu impllementieren.
bis bald
akari
-
Hallo Akari,
das klingt ja nach einem mittleren Gau. Und wirft die Frage auf, benutzt 'man' diese Standardkomponente nicht in dem oben beschriebenen Sinne oder benutzt 'man' sie zwar, aber nimmt das Fehlverhalten in Kauf? Oder weiß gar nicht darum?
Hättest Du einen Tipp, wie so eine selbst gebaute Sortierung aussehen könnte?
Gruß
Leo
-
Hallo
Grundsätzlich dürfte Windows dafür verantwortlich sein, das "kuss" == "kuß", wie die Hilfe es mit lokalen Einstellungen des Systems ausdrückt. Mit TListBox hat das nur insofern zu tun das man diesem Control keine andere Suchmethode zuweisen kann.
Eine Sortierung läßt sich mit den üblichen Sortieralgorithmen implementieren, zum Beispiel Quicksort. Am einfachsten ist es natürlich std::sort zu benutzen.
TStringList* sl = new TStringList(); //sl->Sorted = true; //sl->Duplicates = false; //sl->CaseSensitive = false; std::vector<AnsiString> strings; strings.push_back("muss"); strings.push_back("muß"); strings.push_back("kuss"); strings.push_back("kuß"); std::sort(strings.begin(), strings.end()); for (std::vector<AnsiString>::iterator it = strings.begin(); it != strings.end(); ++it) { sl->Add(*it); } ListBox_Debug->Items->Add("Anzahl StringList-Elemente: " + IntToStr(sl->Count)); ListBox_Debug->Items->AddStrings(sl); sl->Free();
bis bald
akari
-
Du könntest TStringList::Sorted auf false setzen und die Methode CustomSort aufrufen.
-
Hallo
Oder noch besser mit std::set, da werden auch die (echten) Duplikate noch beachtet
TStringList* sl = new TStringList(); //sl->Sorted = true; //sl->Duplicates = false; //sl->CaseSensitive = false; std::set<AnsiString> strings; strings.insert("muss"); strings.insert("muß"); strings.insert("kuss"); strings.insert("kuß"); for (std::set<AnsiString>::iterator it = strings.begin(); it != strings.end(); ++it) { sl->Add(*it); } ListBox_Debug->Items->Add("Anzahl StringList-Elemente: " + IntToStr(sl->Count)); ListBox_Debug->Items->AddStrings(sl); sl->Free();
/Edit : Nagut... TStringList::CustomSort ist wohl doch die beste Wahl
bis bald
akari
-
...und dann im Vergleicher CompareText(String, String) aufrufen. Bei operator== sortiert er ss und ß nicht.