首页 > 解决方案 > 在复杂对象的结构中按变量对列表进行排序

问题描述

我有一个从 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()));
        }
    });

但是第二个变体会创建很多新的日期对象。每个条目的最坏情况很多次。

有没有更漂亮的方法呢?

标签: javasorting

解决方案


可以为唯一日期创建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);

推荐阅读