我实现了比较器,以按最新修改的顺序(从新到旧)对文件数组进行排序。
由于lastModifed返回long而不是int,并且compare
方法返回int,因此我假设compare
方法应在arg0比arg1更大时返回一个正整数,然后arg1而不是不写正整数,我写道:
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
if (file1.lastModified() - file2.lastModified() > 0) {
return 0;
}
else {
return 1;
}
}
然后我打电话给
Arrays.sort(fileArray, fileModComparator);
没有对数组进行排序(偶然将数组从新到旧排序)。
我将FileModComparator更改为:
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
return (int)(file1.lastModified() - file2.lastModified())*-1;
}
}
这很好用,但有变长而不是整数的风险。
1)为什么我的比较器的第一个版本不起作用?
2)如何避免长效风险?
答案 0 :(得分:3)
在使用Java-8及更高版本时,您可以使用此比较器,而不是为此创建自己的类:
Comparator<File> comparator = Comparator.comparingLong(File::getLastModified);
等于这样的东西:
Comparator<File> comparator =
(left, right) -> Long.compare(left.getLastModifed(), right.getLastModified());
答案 1 :(得分:3)
在else
语句中,如果元素相等或劣等,则将其视为上级,而将元素视为优越则将其视为相同:
if (file1.lastModified() - file2.lastModified() > 0) {
return 0;
}
else {
return 1;
}
它似乎是错误的。
您应该分别一致地处理每种情况,并使用Long.compare()
来将代码减少为:
return Long.compare(file1.lastModified(), file2.lastModified() );
答案 2 :(得分:0)
您的第一个版本永远不会返回负数,因此您仅实现了compare()
应该执行的操作的2/3。
数字本身并不重要,因此-1
,0
和1
可以并且经常用作返回值。
答案 3 :(得分:0)
使用类似Long
的比较:
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
return Long.compare(file1.lastModified(), file2.lastModified());
}
}