如何根据字符串格式的日期对 ArrayList 进行排序?
How to sort ArrayList according to Date which is in string format?
这与 This 完全相同,但有一个微妙的区别。
我有一个 'LOBServiceRequestDetails' 类型的 ArrayList,它使用来自 Web 服务的值进行更新。 LOBServiceRequestDetails 的一些变量如下,
- 字符串#agentId
- String#creationDate(dd/MM/yyyy hh:mm:ss 格式)
我想根据创建日期对列表进行排序。我的一种方法是在 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{...
您将空值放在列表的末尾。
符合您预期结果的输出屏幕截图
这与 This 完全相同,但有一个微妙的区别。 我有一个 'LOBServiceRequestDetails' 类型的 ArrayList,它使用来自 Web 服务的值进行更新。 LOBServiceRequestDetails 的一些变量如下,
- 字符串#agentId
- String#creationDate(dd/MM/yyyy hh:mm:ss 格式)
我想根据创建日期对列表进行排序。我的一种方法是在 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{...
您将空值放在列表的末尾。
符合您预期结果的输出屏幕截图