在Java中按升序对文件进行排序

时间:2014-12-09 21:19:04

标签: java arrays sorting comparator

我一直在使用此方法按升序对文件进行排序:

File folder = new File("F:/test/");
File files[] = folder.listFiles();
Arrays.sort(files, new Comparator<File>() {
    @Override
    public int compare(final File o1, final File o2) {
        return o1.getName().compareTo(o2.getName());
    }
});
for (File f : files) {
    System.out.println(f.getName());
}

文件

  1. 1_Test.txt
  2. 2_Test.txt
  3. 10_Test.txt
  4. 12_Test.txt
  5. 20_Test.txt

  6. 但我得到的 结果 是:

    1. 10_Test.txt
    2. 12_Test.txt
    3. 1_Test.txt
    4. 20_Test.txt
    5. 2_Test.txt
    6. 为什么我会得到这样的结果?如何根据文件名的数字部分而不是按字母顺序排列的顺序,以数字递增的顺序获得结果?

4 个答案:

答案 0 :(得分:2)

Java字符串的compareTo函数比较Lexicographically的值。如果这不是您想要的排序算法,则需要为比较器使用其他东西。

根据文件的命名方案,您可能想要尝试的一个好选择是从字符串的开头提取数字,并将其解析为int。有些东西......

String[] parts = o1.split("_");
int lhs = Integer.parseInt(parts[0]);
parts = o2.split("_");
int rhs = Integer.parseInt(parts[0]);
return lhs.compareTo(rhs);

答案 1 :(得分:2)

使用compareTo()比较两个字符串将比较它们字典,它基于每个字符的值。这意味着10_例如在1_之前。

您真正想要做的是比较文件名称的数字部分:

Arrays.sort(files, new Comparator<File>() {
    @Override
    public int compare(File f1, File f2) {
        String name1 = f1.getName();
        String name2 = f2.getName();
        Integer num1 = Integer.valueOf(name1.substring(0, name1.indexOf("_")));
        Integer num2 = Integer.valueOf(name2.substring(0, name2.indexOf("_")));
        return num1.compareTo(num2);
    }
});

答案 2 :(得分:1)

您需要一个更好的比较方法来提取数字。注意:这是一个简单的例子,假设您的文件名都采用Number_otherStuff.txt格式。

public int compare(final File o1, final File o2) {
    Integer f1Num = Integer.parseInt(o1.getName().substring(o1.getName().indexOf('_')));
    Integer f2Num = Integer.parseInt(o2.getName().substring(o2.getName().indexOf('_')));

    return f1Num.compareTo(f2Num);
}

答案 3 :(得分:0)

假设00-2F范围内没有特殊字符:

int max = max_length_of_file_name + Math.log10(max_leading_number);
return leftPadWith0ToMaxLength(o1.getName(), max).compareTo(leftPadWith0ToMaxLength(o2.getName(), max));

将leftPadWith0ToMaxLength,max_length_of_file_name,max_leading_number的代码留作练习。