簡體   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