【问题标题】:Sorting of files with numerical names in Java在Java中对具有数字名称的文件进行排序
【发布时间】:2013-04-04 13:43:41
【问题描述】:

我需要按名称按正确顺序对文件进行排序,就像在默认的 Windows 资源管理器中一样。
标准的 java 字符串比较器运行良好,直到只有字母值。如果名称中有任何数字,则表示错误,例如:
名称为“15 - abc.txt”的文件将在列表中高于“2 - abc.txt”。
对于多语言情况(应使用 java.text.Collat​​or)解决此问题的最佳方法是什么?

【问题讨论】:

  • 因此,换句话说,您不希望它像在 Windows 资源管理器中那样工作。
  • 看来您有自己的答案:应该使用java.text.Collator。你至少试过了吗?
  • @LuiggiMendoza 是的,我有。

标签: java file sorting


【解决方案1】:

实现您自己的比较器,根据需要考虑数字。此比较器可以按组拆分文件名:数字与其他字符分开。

例如15-abc-32b.txt 将产生数组{"15", "abc", "32", "b"}。现在比较这些数组很简单。您应该检查元素并尝试使用Integer.pareseInt() 解析它们。如果解析成功比较适当的数字,否则比较字符串。

【讨论】:

    【解决方案2】:

    使用 Java Comparator 并通过依次比较文件名的整数和字符串字段来实现 compare() 方法。

    【讨论】:

    • 请注意java.text.Collator 已经实现了Comparator 接口。来自its JavadocCollat​​or 类执行对区域设置敏感的字符串比较。您可以使用此类为自然语言文本构建搜索和排序例程。
    【解决方案3】:

    考虑到 NumberFormat 将“15-abc-32b.txt”解析为 15(请参阅 API),您可以像这样对文件进行排序

        String[] files = new File("dir").list();
        Arrays.sort(files, new Comparator<String>() {
            NumberFormat f = NumberFormat.getInstance();
            public int compare(String f1, String f2) {
                try {
                    return Double.compare(f.parse(f1).longValue(), f.parse(f2).longValue());
                } catch (ParseException e) {
                    throw new IllegalArgumentException(f1 + "|" + f2);
                }
            }
        });
    

    【讨论】:

    • 不好的方式。如果我有一个名为“abc - (1).txt”的文件,它应该不起作用。
    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2019-07-31
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多