如何在Java中比较对象和排序列表

时间:2014-05-16 16:47:39

标签: java comparator

我有一个对象类:

public class FileDetails  {

String filePath;
String fileName;
String timeStamp;
}

现在我有一个FileDetails列表列表,我希望按日期排序。

我试图这样排序:

public FileDetails getMaxLastModified(List<FileDetails> fileDetails) {

     return Collections.max(fileDetails, new LastModifiedFileDetailsComparator());
}   

我的比较器是:

public class LastModifiedFileDetailsComparator implements
        Comparator<FileDetails> {

    public int compare(FileDetails f1, FileDetails f2) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = null;
        Date date2 = null;

        try {
            date1 = sdf.parse(f1.getTimeStamp());
            date2 = sdf.parse(f2.getTimeStamp());

        } catch (ParseException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }


         if(date1.compareTo(date2)>0){ return f1; }else
         if(date1.compareTo(date2)<0){ return f2; }
                     else { return f1; }

    }
}

我在比较器中遇到错误:Type mismatch: cannot convert from FileDetails to int。谁能告诉我正确的方法?

4 个答案:

答案 0 :(得分:4)

如果第一个对象“小于”第二个对象,则Comparator应该返回一个负数,如果它们“相等”则返回0,如果第一个对象是“大于“第二个对象。它不应该返回其中一个对象。

compare method返回int,其Javadocs声明:

  

返回:

     

负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

答案 1 :(得分:0)

您的问题是,当您的方法指定您应该返回int时,您将返回FileDetails类型的对象(f1或f2)。确保实际返回的类型与您在方案签名中返回的类型兼容。

compare()方法是一种特殊情况,作为类Comparator的实现方法。这是您正在实现的方法,您的方法签名(public int compare(FileDetails f1,FileDetails f2)是正确的。您应该按照特定模式将返回类型更改为int:

  

(1)如果第一个参数小于第二个参数,则返回负数

     

(2)如果第一个参数等于第二个参数,则返回0

     

(3)如果第一个参数大于第二个参数,则返回一个正int

答案 2 :(得分:0)

阅读JavaDocs时,请考虑关注JavaDocs。 这是Comparator的链接。 阅读compare方法的返回值。

这是一种通用的比较方法, 修改它以满足您的需要(Type是要比较的类类型)。

public int compare(Type left, Type right)
{
    if (left < right)
    {
        return -1;
    }

    if (left == right)
    {
        return 0;
    }

    // left must be > right.
    return 1;
}

答案 3 :(得分:0)

感谢ZouZou。他的回应是: Collections.max不排序...还要查看compare方法的返回类型以及实际返回的内容。 IMO,您最好的选择是将时间戳存储为时间戳(如果这是您真正想要的,则为日期),然后返回f1.timeStamp.compareTo(f2.timeStamp); - 邹邹

以这种方式工作:

public FileDetails getMaxLastModified(List<FileDetails> fileDetails) {


     FileDetails[] files = (FileDetails[]) fileDetails.toArray(new FileDetails[fileDetails.size()]);

     Arrays.sort(files,  FileDetailComparator);

    return files[0];
}



public static Comparator<FileDetails> FileDetailComparator = new Comparator<FileDetails>() {

    public int compare(FileDetails f1, FileDetails f2) {
                    //For descending
                   return f2.getDate().compareTo(f1.getDate());

                   //For ascending
                   //return f1.getDate().compareTo(f2.getDate());

    }

};