Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中按升序对文件排序_Java_Arrays_Sorting_Comparator - Fatal编程技术网

在Java中按升序对文件排序

在Java中按升序对文件排序,java,arrays,sorting,comparator,Java,Arrays,Sorting,Comparator,我一直在使用此方法对文件进行升序排序: File folder=新文件(“F:/test/”; File files[]=folder.listFiles(); Arrays.sort(文件,新的Comparator(){ @凌驾 公共整数比较(最终文件o1,最终文件o2){ 返回o1.getName().compareTo(o2.getName()); } }); 用于(文件f:文件){ System.out.println(f.getName()); } 文件夹 1_Test.txt 2_

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

File folder=新文件(“F:/test/”;
File files[]=folder.listFiles();
Arrays.sort(文件,新的Comparator(){
@凌驾
公共整数比较(最终文件o1,最终文件o2){
返回o1.getName().compareTo(o2.getName());
}
});
用于(文件f:文件){
System.out.println(f.getName());
}
文件夹
  • 1_Test.txt
  • 2_Test.txt
  • 10_Test.txt
  • 12_Test.txt
  • 20_Test.txt

  • 但是我得到的结果是:

  • 10_Test.txt
  • 12_Test.txt
  • 1_Test.txt
  • 20_Test.txt
  • 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);
    

    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);
        }
    });
    
    Arrays.sort(文件,新比较器(){
    @凌驾
    公共整数比较(文件f1、文件f2){
    字符串名称1=f1.getName();
    字符串名称2=f2.getName();
    整数num1=Integer.valueOf(name1.substring(0,name1.indexOf(“”));
    整数num2=Integer.valueOf(name2.substring(0,name2.indexOf(“”));
    返回num1.compareTo(num2);
    }
    });
    
    使用
    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);
        }
    });
    
    Arrays.sort(文件,新比较器(){
    @凌驾
    公共整数比较(文件f1、文件f2){
    字符串名称1=f1.getName();
    字符串名称2=f2.getName();
    整数num1=Integer.valueOf(name1.substring(0,name1.indexOf(“”));
    整数num2=Integer.valueOf(name2.substring(0,name2.indexOf(“”));
    返回num1.compareTo(num2);
    }
    });
    
    您需要一种更好的比较方法来提取数字。注意:这是一个简单的例子,假设文件名的格式都是
    Number\u 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);
    }
    

    您需要一个更好的比较方法来提取数字。注意:这是一个简单的例子,假设文件名的格式都是
    Number\u 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));
    

    LeftPad的代码为0 ToMaxLength,文件名的最大长度,作为练习的最大前导编号。假定00-2F范围内没有特殊字符:

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

    LeftPad的代码为0 Tomaxlength,文件名的最大长度,作为练习的最大前导数。按字典顺序,这是正确的。从技术上讲,这是正确的顺序。因为1012小于1,因为chars:0的整数值为48,
    2
    是50,
    是95。因为您正在进行词法排序。因此,它首先对所有以1开头的名称进行排序,然后对值最低的第二个字符进行排序,依此类推。您需要做的是更改比较器,这样,如果两个对象在同一起始索引中都有一个数字,则将子字符串从起始索引解析为下一个非数字字符,然后比较它的整数值。按字典顺序,这是正确的顺序。从技术上来说,这是正确的顺序。因为
    10
    12
    小于
    1,因为
    char
    s的整数值:
    0
    是48,
    2
    是50,
    是95。因为您正在进行词法排序。因此,它首先对所有以1开头的名称进行排序,然后对值最低的第二个字符进行排序,依此类推。您需要做的是更改比较器,这样,如果两个对象在同一起始索引中都有一个数字,则将子字符串从起始索引解析为下一个非数字字符,然后比较其整数值。假设没有两个文件具有相同的前导编号。假设没有两个文件具有相同的前导编号。