【问题标题】:Windows Explorer sort methodWindows 资源管理器排序方法
【发布时间】:2009-01-14 09:47:24
【问题描述】:

我正在寻找一种对字符串进行排序的算法,类似于在 Windows 资源管理器中对文件(和文件夹)进行排序的方式。似乎在排序时会考虑字符串中的数值,这会导致类似

name 1, name 2, name 10

而不是

name 1, name 10, name 2

通过常规字符串比较得到。

我正要自己开始写这篇文章,但想检查一下是否有人以前这样做过,并愿意分享一些代码或见解。我将解决此问题的方法是在比较名称中的数值之前添加前导零。这将导致类似

name 00001, name 00010, name 00002

当使用常规字符串排序时,它会给我正确的结果。

有什么想法吗?

【问题讨论】:

标签: algorithm sorting


【解决方案1】:

这称为“自然排序顺序”。不久前,Jeff 有一个 pretty extensive blog entry,它描述了您可能忽略的困难,并提供了几个实现的链接。

【讨论】:

    【解决方案2】:

    Explorer 使用 API StrCmpLogicalW() 进行这种排序(称为“自然排序顺序”)。

    你不需要自己写比较函数,使用已经存在的就行了。

    可以在here找到一个很好的解释。

    【讨论】:

      【解决方案3】:

      StrCmpLogicalW,但它仅从 Windows XP 开始可用,并且仅实现为 Unicode。

      一些背景资料: http://www.siao2.com/2006/10/01/778990.aspx

      【讨论】:

        【解决方案4】:

        按照我的理解,Windows 资源管理器按照您的第二个示例进行排序 - 排序为 1、10、2 总是让我非常恼火。这就是为什么大多数编写大量文件的应用程序(如批处理应用程序)总是使用以 0 或其他开头的固定长度文件名。

        您的解决方案应该有效,但您需要注意文件名中的数字,并且可能仅在它们位于最后时才使用您的方法。

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:

            我还发布了一个相关问题,其中包含其他提示和陷阱:

            Sorting strings is much harder than you thought

            【讨论】:

              【解决方案7】:

              我在这里发布了代码(C#)和算法描述:

              Natural Sort Order in C#

              【讨论】:

                【解决方案8】:

                这是尝试在 Java 中实现它:

                Java - Sort Strings like Windows Explorer

                简而言之,它将两个字符串拆分为字母 - 数字部分进行比较,并以特定方式比较这部分以实现这种排序。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-12-11
                  • 2010-12-06
                  • 2013-10-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-07-28
                  • 1970-01-01
                  • 2014-06-05
                  相关资源
                  最近更新 更多