文件上次修改的编译器

时间:2018-07-19 09:24:53

标签: java compare

我实现了比较器,以按最新修改的顺序(从新到旧)对文件数组进行排序。

由于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)如何避免长效风险?

4 个答案:

答案 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。

数字本身并不重要,因此-101可以并且经常用作返回值。

答案 3 :(得分:0)

使用类似Long的比较:

private class FileModComparator implements Comparator<File> {

    @Override
    public int compare (File file1, File file2) {
        return Long.compare(file1.lastModified(), file2.lastModified());
    }
}