2012-12-13 20 views
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月4日

+0

你试过调试吗?在'compareTo'中放置一个断点。 –

回答

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年)。

+0

请参阅问题编辑 –

+0

@ user470184您需要按降序反转比较:'return date2.compareTo(date1);' - 请参阅我的编辑。 – assylias

0

你比较日期本身,而不是对象

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

通过在哪儿使用o

DateObject给你什么,btw?它看起来像一个Date对象。请注意,java.util.Date保存日期时间信息,令人困惑。如果你使用标准的日期对象,那么你不必写一个比较器。更好的是,您可以调查Joda-Time,它具有更好,更直观和线程安全的API。

+0

在这种情况下,DateObject是包含日期/时间字段的较大对象的剥离版本 –

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); 
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)将按升序排序。

0

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

相关问题