Java 上次修改的Comperator文件
我实现了comparator,按照上次修改的文件数组从新到旧进行排序 由于LastModifid返回的是long而不是int,并且Java 上次修改的Comperator文件,java,compare,Java,Compare,我实现了comparator,按照上次修改的文件数组从新到旧进行排序 由于LastModifid返回的是long而不是int,并且compare方法返回int,并且我假设compare方法在arg0比arg1“大”时应该返回正int,而在arg1不大时应该返回非正int,因此我写道: private class FileModComparator implements Comparator<File> { @Override public int compare (
compare
方法返回int,并且我假设compare
方法在arg0比arg1“大”时应该返回正int,而在arg1不大时应该返回非正int,因此我写道:
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;
}
}
未对数组应用排序(数组是偶然地从旧到新排序的)
我将FileModComparator更改为:
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
return (int)(file1.lastModified() - file2.lastModified())*-1;
}
}
私有类FileModComparator实现Comparator{
@凌驾
公共int比较(文件file1、文件file2){
return(int)(file1.lastModified()-file2.lastModified())*-1;
}
}
这样做效果很好,有可能变长而不是变整数
1) 为什么我的比较器的第一个版本不起作用
2) 如何避免长期结果风险?您的第一个版本从不返回负数,因此您只实现了
compare()
应该做的事情的2/3
数字本身并不重要,因此
-1
、0
和1
可以并且经常被用作返回值。使用Java-8及以上版本时,您可以使用此比较器,而不是为此创建自己的类:
Comparator<File> comparator = Comparator.comparingLong(File::getLastModified);
Comparator Comparator=Comparator.comparingLong(文件::getLastModified);
这等于这样的东西:
Comparator<File> comparator =
(left, right) -> Long.compare(left.getLastModifed(), right.getLastModified());
比较器比较器=
(左,右)->Long.compare(左.getLastModified(),右.getLastModified());
在Eng/Cuth>语句中,如果元素等于或小于,则认为元素为优等,并且认为元素与它相同:
if (file1.lastModified() - file2.lastModified() > 0) {
return 0;
}
else {
return 1;
}
这似乎是错误的。
您应该清楚、一致地处理每种情况,并使用Long.compare()
,将代码简化为:
return Long.compare(file1.lastModified(), file2.lastModified() );
使用类似以下内容的compare fromLong
:
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
return Long.compare(file1.lastModified(), file2.lastModified());
}
}
私有类FileModComparator实现Comparator{
@凌驾
公共int比较(文件file1、文件file2){
返回Long.compare(file1.lastModified(),file2.lastModified());
}
}
你能提供一个来源吗?@Alaychem为什么?数字不重要吗?在你开始写代码之前,你还没有读过吗?你应该为自己感到羞耻,当它在该死的Javadocs中读对的时候,你问我“source”。@Alaychem你唯一需要关心的是,如果compare(x,y)
给出一个正数,那么compare(y,x)
必须给出一个负数,反之亦然。精度损失没有影响,所以没有风险。@Jai这只是要求之一。它还需要是可传递的。但这些是用来手工编写比较器的。现代Java有很多更简单的方法(如其他答案所示,例如,comparingLong
)。@Kayaman实际上,我去了javadocs,但不知何故我错过了。哎呀。谢谢你的时间。简短的一行,没有像数学这样复杂的东西。你甚至不需要创建一个类@Jai这就是我喜欢Java-8及以上版本的原因。到处使用的通用代码只是被方法调用所取代。开发人员实际上不需要知道比较是如何工作的,只要它是可读的。@Lino这里没有JAVA 8。。我在看你的预编辑post@AlaychemJava-11即将面世,而您仍在使用Java-8以下的软件?这意味着真的到了升级的时候了。@Lino我对你的答案投了赞成票,它“更酷”,但我会用david的。
private class FileModComparator implements Comparator<File> {
@Override
public int compare (File file1, File file2) {
return Long.compare(file1.lastModified(), file2.lastModified());
}
}