小编典典

以用户友好的方式对包含数字的字符串进行排序

algorithm

习惯了标准的字符串排序方式,当我注意到Windows以一种高级方式按文件名对文件排序时,我感到惊讶。让我举一个例子:

Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3

我认为这些名称是根据字母和数字分别进行比较(排序时)的。

另一方面,以下是按标准方式排序的相同列表:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3

我想在Delphi中创建一个比较算法,让我以相同的方式对字符串进行排序。刚开始,我认为比较两个字符串(如果是字母)的连续字符就足够了。当在两个字符串的某个位置都找到一个数字时,我将读取跟随它们的所有数字以形成一个数字,然后比较这些数字。

举个例子,我将以这种方式比较“ Track10”和“ Track2”字符串:
1)在字符相等且为字母的情况下读取字符:“ Track”,“ Track”
2)如果找到数字,读取以下所有数字:“ 10”,“ 2”
2a)如果它们相等,则转到1或否则完成
十大于二,因此“ Track10”大于“ Track2”

似乎一切都会好起来,直到我在测试中注意到Windows认为“ Track010”比“
Track10”低时,而我认为第一个更大,因为它更长了(根据我的算法并没有提到字符串将相等,这是错误的)。

您能否为我提供Windows如何按名称对文件进行精确排序的想法,或者您有一个可以使用的即用型算法(任何编程语言)?

非常感谢!
马吕斯


阅读 267

收藏
2020-07-28

共1个答案

小编典典

Jeff在《编码恐怖》上写了一篇有关此的文章。这称为自然排序,您可以在其中有效地将一组数字视为单个“字符”。在阳光下,每种语言都有实现,但是奇怪的是,它通常不是大多数语言的标准库内置的。

2020-07-28