这与This完全相同,但有一个棘手的区别。 我有一个类型为' LOBServiceRequestDetails'的ArrayList。它使用来自Web服务的值进行更新。 LOBServiceRequestDetails的一些变量如下所示,
我想根据creationDate对此列表进行排序。我有一种方法是在LOBServiceRequestDetails模型类中实现Comparable并覆盖compareTo方法,但由于某些问题,我无法更改此类。所以我使用了Collection.sort,如下所示,
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Collections.sort(lOBServiceRequestDetailsList, new Comparator<LOBServiceRequestDetails>() {
public int compare(LOBServiceRequestDetails o1, LOBServiceRequestDetails o2) {
if (o1.getCreationDate() == null || o2.getCreationDate() == null)
return 0;
try{
return sdf.parse(o1.getCreationDate()).compareTo(sdf.parse(o2.getCreationDate()));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
});
但这不符合预期。任何帮助表示赞赏。
预期产出:
[LOBServiceRequestDetails [ creationDate = 22/05/2017 2017:31:20 ,agentId = ag11],LOBServiceRequestDetails [ creationDate = 07/02/2017 2017 11:10:20 ,agentId = ag12],LOBServiceRequestDetails [ creationDate = 06/12/2016 12:51:20 ,agentId = ag13],LOBServiceRequestDetails [ creationDate = 17/12/2015 06:44 :20 ,agentId = ag14]]
实际输出:
[LOBServiceRequestDetails [ creationDate = 06/12/20/2016 11:10:20 ,agentId = ag11],LOBServiceRequestDetails [ creationDate = 17/12/2015 06:44:20 ,agentId = ag12],LOBServiceRequestDetails [ creationDate = 07/02/2017 11:10:20 ,agentId = ag13],LOBServiceRequestDetails [ creationDate = 22/05/2017 2017 10:31 :20 ,agentId = ag14]]
答案 0 :(得分:1)
你在compareTo的两边使用o1.getCreationDate():
return sdf.parse(o1.getCreationDate()).compareTo(sdf.parse(o1.getCreationDate()));
编辑:这解决了一个问题,但处理空值的方式仍然是一个错误,因为如#34; OH GOD SPIDERS&#34;的注释中所解释的,如果两个日期中的一个是空的他们被认为是平等的。 例如,如果您以这种方式改变您的状况:
if (o1.getCreationDate() == null) return 1;
if (o2.getCreationDate() == null) return -1;
try{...
您可以将空值放在列表的末尾。