我有一个带有自定义对象的ArrayList。每个对象都有两个日期实体Call date
和Appointment date
。此信息(以及其他信息)显示在列表视图中,到目前为止一切正常。
Call date
永远不会为空,并且始终是来自服务器的有效日期。但是,对于少数条目,Appointment date
可以为null。 Call date
和Appointment date
的日期格式相同(Thu Jan 01 00:00:00 GMT 1970)
排序应该是这样的:
Call date
应按日期降序排序
约会日期,如果不是null,则应显示在最上方。但是,它必须按日期的升序排序(例如:如果8月19日有两个约会,8月21日有另一个约会,8月19日应该显示在顶部和21下面)并且所有空值应该在底部
目前,我已经使用两个单独的比较器对Call date
和Appointment date
进行了排序。但是,Appointment date
按降序排列,而不是按升序排列(第21位显示在顶部,第19位在其下方,最后显示为空)。
比较器代码低于
public class CallDateComparator implements Comparator< ListModel > {
@Override
public int compare(ListModel o1, ListModel o2) {
if (o2.getCallDate() != null && o1. getCallDate() != null)
return o2.getProspectDate().compareTo(o1.getProspectDate());
else
return 0;
}
}
public class AppointmentDateComparator implements Comparator< ListModel > {
@Override
public int compare(ListModel o1, ListModel o2) {
if (o2.getAppointmentDate() != null && o1.getAppointmentDate() != null)
return o2.getAppointmentDate().compareTo(o1.getAppointmentDate());
else
return 0;
}
}
我通过调用
对ArrayList
进行排序
Collections.sort(myList, new CallDateComparator());
Collections.sort(myList, new AppointmentDateComparator());
上面需要更改的内容才能使约会日期按升序排序,如果它为空,只需保留早期的排序吗?
答案 0 :(得分:1)
我的方法基于评论的格式:
基本上我会做一个更大的比较器,而不是两个不同的比较器。
public class CallDateComparator implements Comparator< ListModel > {
@Override
public int compare(ListModel o1, ListModel o2) {
if (o2.getCallDate() != null && o1. getCallDate() != null)
int i = o1.getProspectDate().compareTo(o2.getProspectDate();
switch (i)
case -1: //o1 smaller than o2
return -1;
break;//this might be not necessary at all.
case 0: //both equal, so, same call date.
if(o1.getAppointmentDate() != null && o2.getAppointmentDate() == null)
{
return 1; // make o1 the bigger one.
}
else if(o1.getAppointmentDate() == null && o2.getAppointmentDate() != null)
{
return -1; // make o2 the bigger one.
}
else if(o1.getAppointmentDate() == null && o2.getAppointmentDate() == null)
{
return 0; //both are equally null.
}
else
{
return o1.getAppointmentDate().compareTo(o2.getAppointmentDate()); //compare then
}
break;
case 1: //o1 bigger than o2
return 1;
break;//this might be not necessary at all.
default:
return 0;
break;
else
return 0;
}
}