java - 在复杂对象的结构中按变量对列表进行排序
问题描述
我有一个从 json 解析的复杂“订单”对象。在结构深处的某个地方,我有 orderDate。我只能将其提取为字符串!现在我尝试对订单列表进行排序。
我提出了创建一个新列表的想法,其中的数组包含两个元素,首先是订单对象本身,其次是解析为日期对象的日期。例如。新对象[]{order, new Date(order.getOrderDate())}。然后按第二个元素排序,然后解析回 List 并返回。但这会创建两个新列表并且不存在。
另一个想法是创建一个像这样排序的自定义比较器
orders.sort(new Comparator<Order>() {
@Override
public int compare(Order o1, Order o2) {
return new Date(o1.getOrderDate()).compareTo(new Date(o2.getOrderDate()));
}
});
但是第二个变体会创建很多新的日期对象。每个条目的最坏情况很多次。
有没有更漂亮的方法呢?
解决方案
可以为唯一日期创建Date
实例 - 使用Map
.
final Comparator<Order> sortByDateAsc = new Comparator<Order>() {
private final Map<String, Date> map = new HashMap<>();
@Override
public int compare(Order o1, Order o2) {
Date d1 = map.computeIfAbsent(o1.getOrderDate(), Date::new);
Date d2 = map.computeIfAbsent(o2.getOrderDate(), Date::new);
return d1.compareTo(d2);
}
};
orders.sort(sortByDateAsc);
推荐阅读
- c# - 向具有 2 个不同刚体的对象添加力
- mongodb - 无法使用 PyMongo 连接 Atlas 集群
- c++ - 每个节点 4 个字符的字符串双向链表
- data-science - 在 n > 2 的情况下,评估 n 向拆分测试最有说服力的方法是什么?
- powershell - 如何使用正则表达式删除以前的数据库快照?
- c# - 如何隐藏在 Visual Studio 16.10 中随处可见的 ...?
- linux - Radeon 开发人员面板未检测到正在运行的程序
- javascript - 这个 id 比较算法有什么问题,内置在 NodeJs 中?
- android - 应用程序在通过 UsbManager 授予连接 [设备] 的权限时崩溃
- typescript - 多个复选框的Vue过滤列表