在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());
}
文件夹
但是我得到的结果是:
为什么我会得到这样的结果?如何根据文件名的数字部分而不是字母顺序,以数字升序获得结果?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,文件名的最大长度,作为练习的最大前导数。按字典顺序,这是正确的。从技术上讲,这是正确的顺序。因为
10
和12
小于1,因为char
s:0
的整数值为48,2
是50,是95。因为您正在进行词法排序。因此,它首先对所有以1开头的名称进行排序,然后对值最低的第二个字符进行排序,依此类推。您需要做的是更改比较器,这样,如果两个对象在同一起始索引中都有一个数字,则将子字符串从起始索引解析为下一个非数字字符,然后比较它的整数值。按字典顺序,这是正确的顺序。从技术上来说,这是正确的顺序。因为10
和12
小于1,因为char
s的整数值:0
是48,2
是50,是95。因为您正在进行词法排序。因此,它首先对所有以1开头的名称进行排序,然后对值最低的第二个字符进行排序,依此类推。您需要做的是更改比较器,这样,如果两个对象在同一起始索引中都有一个数字,则将子字符串从起始索引解析为下一个非数字字符,然后比较其整数值。假设没有两个文件具有相同的前导编号。假设没有两个文件具有相同的前导编号。