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

Mar*_*mke 18 sorting algorithm text numbers

习惯于对字符串进行排序的标准方法,当我注意到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或者完成
Ten大于2,因此"Track10"大于"Track2"

似乎一切都会好的,直到我在测试期间发现Windows认为"Track010"低于"Track10",而我认为第一个更长,因为它更长(没有提到根据我的算法字符串将是相等的,这是错误的).

你能否告诉我Windows如何按名称对文件进行排序,或者你有一个我可以使用的即用型算法(使用任何编程语言)?

非常感谢!
马里乌什

Joh*_*ica 21

杰夫在Coding Horror上发表了一篇关于此事的文章.这称为自然排序,您可以将一组数字有效地视为单个"字符".在阳光下,每种语言都有实现,但奇怪的是,它通常不是内置于大多数语言的标准库中.

  • 谢谢你的线索.我设法找到了我正在寻找的Windows API函数StrCmpLogicalW(http://msdn.microsoft.com/en-us/library/bb759947.aspx). (4认同)