Eine bessere natürliche Sorte schreiben (als meine)

8

Ich habe hier eine Antwort auf diese Frage hinzugefügt: Sortiere List<String> in C # welche Anrufe für eine natürliche Sortierreihenfolge, eine, die eingebettete Zahlen behandelt.

Meine Implementierung ist jedoch naiv, und anstelle all der Posts darüber, wie Anwendungen Unicode nicht korrekt handhaben, indem ich Dinge annahm (die Türkei irgendjemanden testet?), dachte ich, ich würde um Hilfe bitten, um ein besseres zu schreiben Implementierung. Oder, wenn es eine eingebaute Methode von .NET gibt, bitte sagen Sie mir:)

Meine Implementierung für die Antwort in dieser Frage geht einfach durch die Strings und vergleicht Zeichen für Zeichen, bis sie in beiden eine Ziffer trifft. Dann extrahiert es aufeinanderfolgende Ziffern aus beiden Zeichenfolgen, was zu unterschiedlichen Längen führen kann, füllt die kürzesten mit führenden Nullen und vergleicht dann.

Allerdings gibt es Probleme damit.

Zum Beispiel, was passiert, wenn Sie in der Zeichenkette x zwei Codepunkte haben, die zusammen das Zeichen È bilden, aber in der anderen Zeichenkette nur einen Codepunkt haben, den einen, der das Zeichen ist.

Mein Algorithmus würde bei diesen fehlschlagen, da er den diakritischen Codepunkt als einzelnes Zeichen behandelt und ihn mit dem von der anderen Zeichenfolge vergleicht.

Kann mir jemand sagen, wie ich damit richtig umgehen soll? Ich möchte Unterstützung für die Angabe eines CultureInfo -Objekts, um Sprachprobleme zu behandeln, wie "ss" mit "ß" in Deutschland vergleichen, und ähnliches.

Ich denke, ich muss meinen Code dazu bringen, anstelle von einzelnen Codepunkten über "echte Zeichen" (ich kenne den tatsächlichen Begriff hier nicht) zu zählen.

Was ist der richtige Ansatz dafür?

Wenn "natürlich" auch "die Art und Weise, wie Menschen erwarten, dass es funktioniert" bedeutet, würde ich Folgendes hinzufügen:

  • Was ist mit Daten und Zeiten?
  • Was ist mit Fließkommawerten?
  • Gibt es andere Sequenzen, die als "natürlich" gelten?
    • Wie weit soll das gedehnt werden? (Eeny, meeny, miny, moe)
Lasse Vågsæther Karlsen 15.09.2010, 11:26
quelle

2 Antworten

7

Dies ist bereits in Windows verfügbar, die Shell verwendet beim Sortieren der Dateien in einem Explorer-Fenster eine natürliche Sortierreihenfolge. Die von ihm verwendete Vergleichsfunktion wird exportiert und steht für jedes Programm zur Verfügung, zumindest seit Windows 2000. Obwohl P / Invoke nicht die beste Lösung ist, hat es den erheblichen Vorteil, in den letzten 10 ungeraden Jahren millionenfach getestet worden zu sein. Und Strings so zu sortieren, dass der Benutzer bereits gut damit vertraut ist.

Die Behandlung von diakritischen Zeichen ist bereits Teil von .NET, die Methode string.Normalize () kümmert sich darum.

Hier ist ein Beispielprogramm, das es verwendet, es sortiert die Strings richtig wie im ursprünglichen Thread angefordert:

%Vor%     
Hans Passant 15.09.2010, 13:12
quelle
2

Ich weiß nicht viel über .NET, aber da es auch eine algorithmische Frage ist, hier sind meine zwei Cent:

Ich würde versuchen, die Zeichenfolge in Token aufzuteilen, wahrscheinlich mit regulären Ausdrücken. Dann können Sie das Zeichenfolgen-Token mit dem Token vergleichen, indem Sie je nach Token-Typ eine entsprechende Vergleichsfunktion verwenden.

Genauer gesagt:

  1. Definiere reguläre Ausdrücke für Daten, Zahlen, Wörter, ... Die letzte davon sollte ein Fallback-Ausdruck sein, der mit einem beliebigen Zeichen übereinstimmt.
  2. Probieren Sie jeden Ausdruck aus, am spezifischsten zuerst, bis einer am Anfang beider Zeichenfolgen
  3. übereinstimmt
  4. Extrahieren Sie den übereinstimmenden Teil und vergleichen Sie ihn mit der entsprechenden Vergleichsfunktion.
  5. Bei Gleichheit entfernen Sie die Übereinstimmung vom Anfang beider Zeichenfolgen und wiederholen Sie den Vorgang ab Schritt 2.

Mit regulären Ausdrücken sollte es auch möglich sein, Unicode zu unterstützen, wenn Sie nicht [a-zA-Z] , sondern geeignete Zeichenklassen wie [:alpha:] verwenden.

Was den Vergleich der verschiedenen Formen von È betrifft, können Sie versuchen, die Zeichenfolge zuerst zu zu normalisieren .

>     
Jonas Wagner 15.09.2010 12:01
quelle