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

时间:2017-06-20 12:08:00

标签: java arraylist collections compareto

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

  • 字符串#的agentId
  • String#creationDate(dd / MM / yyyy hh:mm:ss format)

我想根据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]]

1 个答案:

答案 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{...

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

与预期结果匹配的输出的屏幕截图 enter image description here