如何根据字符串格式的日期对 ArrayList 进行排序?

How to sort ArrayList according to Date which is in string format?

这与 This 完全相同,但有一个微妙的区别。 我有一个 'LOBServiceRequestDetails' 类型的 ArrayList,它使用来自 Web 服务的值进行更新。 LOBServiceRequestDetails 的一些变量如下,

我想根据创建日期对列表进行排序。我的一种方法是在 LOBServiceRequestDetails 模型 class 中实现 Comparable 并覆盖 compareTo 方法,但由于某些问题我无法更改此 class。所以我使用 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 10:31:20, agentId=ag11], LOBServiceRequestDetails [creationDate=07/02/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/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 10:31:20, agentId=ag14]]

您在 compareTo 的两边都使用了 o1.getCreationDate():

   return sdf.parse(o1.getCreationDate()).compareTo(sdf.parse(o1.getCreationDate()));

编辑:这解决了一个问题,但处理空值的方式仍然存在错误,因为如 "OH GOD SPIDERS" 的评论中所述,如果两个日期之一为空,则它们被视为相等. 例如,如果您以这种方式更改您的条件:

              if (o1.getCreationDate() == null) return 1;
              if (o2.getCreationDate() == null) return -1;
          try{...

您将空值放在列表的末尾。

符合您预期结果的输出屏幕截图