繁体   English   中英

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

[英]Sort files in ascending order in Java

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

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

但是我得到的结果是:

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

为什么我得到这种结果? 如何根据文件名的数字部分而不是字母顺序以数字升序获得结果?

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

根据文件的命名方案,您可能想尝试的一个不错的选择是从字符串的开头提取数字,并将其解析为一个int。 类似于...

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

使用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);
    }
});

您将需要一个更好的比较方法来提取数字。 注意:这是一个幼稚的示例,假设您的文件名全部为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);
}

假设在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的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM