Tri de chaînes contenant des nombres de façon conviviale
Être utilisé à la manière standard de tri de chaînes, j'ai été surpris quand j'ai remarqué que Windows trie les fichiers par leur nom dans une sorte de manière avancée. Laissez-moi vous donner un exemple:
Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3
Je pense que ces noms sont comparés (en cours de tri) sur base de lettres et de chiffres séparément.
D'autre part, la suite est de la même liste triée de manière standard:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3
Je voudrais créer une comparaison alogorithm en Delphi, qui permettez-moi de trier les chaînes de la même manière. Au début, je pensais qu'il suffirait de comparer les caractères consécutifs de deux chaînes tandis qu'ils sont des lettres. Quand un chiffre serait trouvé dans une position à la fois les cordes, je lisais tous les chiffres après eux pour former un nombre, puis de comparer les chiffres.
Pour vous donner un exemple, je vais comparer "Track10" et "Piste 2" les chaînes de cette façon:
1) lisez les personnages alors qu'ils sont égaux et qu'ils sont des lettres: "Piste", "Track"
2) si un chiffre est trouvé, lire tous les chiffres suivants: "10", "2"
2a) si elles sont égales, aller à 1 ou d'autre finition
Dix est plus grand que deux, donc "Track10" est supérieur à "Piste 2"
Il m'avait semblé que tout irait bien jusqu'à ce que j'ai remarqué, lors de mes essais, que Windows considéré comme "Track010" inférieur "Track10", alors que je pensais que le premier était plus que il était plus long (pas de mentionner que, selon mon algorithme à la fois les chaînes seraient égaux, ce qui est faux).
Pourriez-vous me fournir l'idée exactement comment Windows trie les fichiers par leur nom ou peut-être vous avez un prêt-à-utilisation de l'algorithme dans un langage de programmation) que je pourrais base sur?
Merci beaucoup!
Mariusz
Désolé, mais je ne savais même pas ce que l'expression à rechercher avant. C'est la raison pour laquelle j'ai dupliqué cette question involontairement. Maintenant, je sais que cette méthode de tri est appelé "tri naturel", de sorte que je peux rechercher plus d'informations à ce sujet par moi-même.
Regarde ce stackoverflow.com/questions/31538293/...
Double de stackoverflow.com/q/248603/24874 a quelques bonnes réponses)
OriginalL'auteur Mariusz Schimke | 2009-06-20
Vous devez vous connecter pour publier un commentaire.
Jeff a écrit un article à ce sujet sur le Codage de l'Horreur. Ceci est appelé tri naturel, où vous traiter efficacement un groupe de chiffres comme un seul "personnage". Il y a des implémentations dans toutes les langues sous le soleil, mais étrangement, il n'est généralement pas intégré à la plupart des langages, bibliothèques standard.
Voici PHP de mise en œuvre: natsort
OriginalL'auteur
Absolue de la manière la plus facile, j'ai trouvé, était d'isoler la chaîne que vous voulez, de sorte que dans le cas des OP cas, le Chemin d'accès.GetFileNameWithoutExtension(), supprimer la non-chiffres, de les convertir en int, et de les trier. L'utilisation de LINQ et certaines méthodes d'extension, c'est un one-liner. Dans mon cas, j'allais sur les répertoires:
Où RemoveNonDigits et ToIntOrZero sont des extensions des méthodes:
Les méthodes d'extension sont communs outils que j'utilise partout. YMMV.
OriginalL'auteur
La mère de toutes sortes:
ls '*.mp3' | sort --version-sort
OriginalL'auteur