Frage

auf die übliche Weise verwendet werden Strings zu sortieren, war ich überrascht, als ich bemerkte, dass Windows sortiert Dateien nach ihrem Namen in einer Art moderner Art und Weise. Lassen Sie mich Ihnen ein Beispiel:

track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3

Ich denke, dass diese Namen verglichen werden (während des Sortierens), basierend auf Buchstaben und Zahlen getrennt.

Auf der anderen Seite ist die folgende die gleiche Liste in üblicher Weise sortiert:
track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3

Ich möchte einen Vergleich alogorithm in Delphi erstellen, die mir Strings in der gleichen Art und Weise sortieren lassen würde. Zuerst dachte ich, es wäre genug aufeinanderfolgende Zeichen von zwei Zeichenfolgen zu vergleichen, während sie Buchstaben sind. Wenn eine Ziffer an einer bestimmten Position der beiden Saiten gefunden würde, würde ich alle Ziffern lesen sie nach einer Reihe zu bilden, und vergleichen dann die Zahlen.

Ihnen ein Beispiel geben, werde ich „Track10“ und „Track2“ Strings auf diese Weise vergleichen:
1) gelesenen Zeichen, während sie gleich sind und während sie sind Buchstaben: „Track“, „Track“
2) wenn eine Ziffer gefunden wird, lesen Sie bitte alle folgenden Zahlen: „10“, „2“
2a), wenn sie gleich sind, gehen zu 1 oder auch beenden
Zehn größer als zwei ist, so "Track10" größer als "Track2"

Es scheint, war, dass alles wäre alles in Ordnung, bis ich bemerkte, während meiner Tests, dass Windows als „Track010“ kleiner als „Track10“, während ich die erste Gedanken war größer als es länger war (nicht zu erwähnen, dass nach mein Algorithmus sowohl die Saiten wäre gleich, was falsch ist).

Könnten Sie mich mit der Idee, wie genau sortiert Windows-Dateien mit Namen oder vielleicht haben Sie einen ready-to-use-Algorithmus (in einem beliebigen Programmiersprache), dass ich Basis auf könnte?

Vielen Dank!
Mariusz

War es hilfreich?

Lösung

Jeff schrieb auf Coding Horror einen Artikel über diese nach oben. Dies nennt man natürliche Sortierung , wo man effektiv eine Gruppe behandeln von Ziffern als ein einzelnen „Charakter“. Es gibt Implementierungen gibt in jeder Sprache unter der Sonne, aber seltsamerweise ist es nicht in der Regel eingebaut in den meisten Sprachen Standardbibliotheken.

Andere Tipps

Der absolute einfachste Weg, fand ich, war die Zeichenfolge isolieren Sie wollen, so im Fall des OP, Path.GetFileNameWithoutExtension (), die Nicht-Ziffern zu entfernen, konvertieren, in int und zu sortieren. Mit LINQ und einige Erweiterungsmethoden, es ist ein Einzeiler. In meinem Fall würde ich auf Verzeichnisse:

Directory.GetDirectories(@"a:\b\c").OrderBy(x => x.RemoveNonDigits().ToIntOrZero())

Wo RemoveNonDigits und ToIntOrZero sind Erweiterungen Methoden:

public static string RemoveNonDigits(this string value) {
    return Regex.Replace(value, "[^0-9]", string.Empty);
}

public static int ToIntOrZero(this string toConvert) {
    try {
        if (toConvert == null || toConvert.Trim() == string.Empty) return 0;            
        return int.Parse(toConvert);
    } catch (Exception) {
        return 0;
    }
}

Die Erweiterungsmethoden sind häufig Werkzeuge, die ich überall benutzen. YMMV.

Die Mutter aller Art:

ls '*.mp3' | sort --version-sort

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top