Java 排序日期/时间对象(最新优先)
我正在尝试使用下面的代码按日期/时间(最晚优先)排序日期对象。顺序不正确。我认为Java 排序日期/时间对象(最新优先),java,datetime,Java,Datetime,我正在尝试使用下面的代码按日期/时间(最晚优先)排序日期对象。顺序不正确。我认为compareTo方法需要以不同的方式实现,以实现所需的排序 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class DateSorter { public static void main(String args[]){ List<DateObje
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;
}
}
该输出应为:
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之前您两次解析同一日期:
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
编辑
刚刚使用returndate2.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年)。您将日期与自身进行比较,而不是与传入的对象进行比较
date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(this.date + " " + this.time);
哪里使用了o
顺便说一句,DateObject
给了你什么?它看起来像一个Date
对象。请注意,java.util.Date
保存日期和时间信息,这让人感到困惑。如果使用标准日期对象,则不必编写比较器。更好的是,您可以调查,它具有更好、更直观和线程安全的API。我认为错误是:
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);
公共类DateObject实现了可比较的{
...
公共整数比较对象(日期对象o){
date2=(日期)格式化程序.parse(o.Date++(o.time);
您应该这样做:
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)将按升序排序。DateObject应实现Comparable。在compareTo方法中,date2需要从传递到方法中的对象派生。在这种情况下,DateObject是一个较大对象的精简版本,其中包含日期/时间字段。是否尝试调试ID?在compareTo
@user4中设置断点70184您需要按降序颠倒比较:返回日期2.比较到(日期1);
-请参见我的编辑。
DateObject other = (DateObject) o;
date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(other.date + " " + other.time);
date2.compareTo(date1);