Java 上次修改的Comperator文件

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 (

我实现了comparator,按照上次修改的文件数组从新到旧进行排序

由于LastModifid返回的是long而不是int,并且
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 from
Long

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());
    }
}