3

我正在尝试使用下面的代码按日期/时间(最新的优先)订购日期对象。顺序不正确。我认为该compareTo方法需要以不同的方式实现以实现所需的排序?

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class DateSorter {

    public static void main(String args[]){

        List<DateObject> list = new ArrayList<DateObject>();

        DateObject d1 = new DateObject("2012-12-05" , "11:21:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-04" , "10:20:19");
        list.add(d1);

        d1 = new DateObject("2010-12-07" , "13:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        Collections.sort(list);

        for(DateObject d : list){
            System.out.println(d);
        }
    }

}

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateObject implements Comparable<Object> {

    private String date;
    private String time;

    public DateObject(String date, String time) {
        this.date = date;
        this.time = time;
    }

    public int compareTo(Object o) {

        DateFormat formatter;
        Date date1 = null;
        Date date2 = null;
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date1 = (Date) formatter.parse(this.date + " " + this.time);
            date2 = (Date) formatter.parse(this.date + " " + this.time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        catch(NullPointerException npe){
            System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
        }

         return date1.compareTo(date2);

    }

    @Override
    public String toString(){       
        return this.date+" "+this.time;
    }

}

这是显示的输出:

2012-12-05 11:21:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-04 10:20:19
2010-12-07 13:20:19
2012-12-05 11:20:19

这个输出应该是:

2010-12-07 13:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:21:19
2012-12-04 10:20:19

更新:当我将 compareTo 方法修改为:

public int compareTo(Object o) {


    DateFormat formatter;
    Date date1 = null;
    Date date2 = null;  
    DateObject other = (DateObject) o;

    formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        date1 = (Date) formatter.parse(this.date + " " + this.time);
        date2 = (Date) formatter.parse(other.date + " " + other.time);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    catch(NullPointerException npe){
        System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
    }

     return date1.compareTo(date2);

}

输出是:

2010-12-07 13:20:19
2012-12-04 10:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:21:19

这仍然不正确,因为 2012-12-05 应该出现在 2012-12-04 之前

4

5 回答 5

5

您正在解析相同的日期两次:

date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(this.date + " " + this.time);

应该是:

date1 = (Date) formatter.parse(this.date + " " + this.time);
DateObject other = (DateObject) o;
date2 = (Date) formatter.parse(other.date + " " + other.time);

在尝试强制转换和使用它之前,您可能应该测试 o 是 DateObject 而不是 null 。

编辑

刚刚尝试使用您更新的代码return date2.compareTo(date1);,我得到:

2012-12-05 11:21:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-04 10:20:19
2010-12-07 13:20:19

这是按降序排列的(请注意,最后一个日期是 2010 年)。

于 2012-12-13T16:22:37.627 回答
0

您正在将日期与自身进行比较,而不是传入的对象

 date1 = (Date) formatter.parse(this.date + " " + this.time);
 date2 = (Date) formatter.parse(this.date + " " + this.time);

用在哪里o

顺便说一句,它给了你什么DateObject?它看起来像一个Date物体。请注意,它java.util.Date包含日期时间信息,令人困惑。如果您使用标准日期对象,则不必编写比较器。更好的是,您可以研究Joda-Time,它具有更好、更直观和线程安全的 API。

于 2012-12-13T16:23:33.233 回答
0

我认为错误是:

 date2 = (Date) formatter.parse(this.date + " " + this.time);

应该

 date2 = (Date) formatter.parse(((DateObject)o).date + " " + ((DateObject)o).time);

你也可以这样做来摆脱演员表:

public class DateObject implements Comparable<DateObject> {
...
public int compareTo(DateObject o) {
    date2 = (Date) formatter.parse(o.date + " " + (o.time);
于 2012-12-13T16:24:43.093 回答
0

你应该这样做:

DateObject other = (DateObject) o;

date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(other.date + " " + other.time);

date2.compareTo(date1);

注意最后一行。你说你希望最新的成为第一个。在这种情况下,您应该将 date2 与 date1 进行比较,反之亦然,因为 date1.compareTo(date2) 将按升序排序。

于 2012-12-13T16:28:58.590 回答
0

DateObject 应该实现 Comparable。在您的 compareTo 方法中, date2 需要从传递给该方法的对象派生。

于 2012-12-13T16:29:43.880 回答