Сортировать список по месту в глубине структуры в сложном объекте - PullRequest
2 голосов
/ 25 февраля 2020

У меня сложный объект "Порядок", проанализированный с json. Где-то глубоко в структуре у меня есть orderDate. Я могу извлечь его только в виде STRING! И теперь я пытаюсь отсортировать список заказов на месте.

Я пришел с идеей создания нового списка, в котором массив внутри состоит из двух элементов, во-первых, самого объекта заказа, во-вторых, даты, проанализированной в A Дата объекта. например. новый объект [] {заказ, новая дата (order.getOrderDate ())}. Затем сортируйте по второму элементу, а затем анализируйте обратно в список и возвращайте. Но это создает два новых списка и не создается.

Другая идея состоит в том, чтобы создать собственный компаратор, который будет сортировать вот так

    orders.sort(new Comparator<Order>() {
        @Override
        public int compare(Order o1, Order o2) {
            return new Date(o1.getOrderDate()).compareTo(new Date(o2.getOrderDate()));
        }
    });

Но второй вариант создаст много нового Дата Объекты. Наихудший случай много раз для каждой записи.

Есть ли более красивый способ обойти это?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Можно создать 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);
0 голосов
/ 25 февраля 2020

Единственный вариант в предоставленном вами сценарии - сравнивать строки напрямую. Таким образом, в основном, разбивая строки на соответствующий контент (год, месяц, день, ...), а затем сравнивайте эти значения. Вы можете вернуться, как только один показатель выше, например, если a.month > b.month, вам не нужно сравнивать день и c.

Но, с другой стороны, это, вероятно, более уродливо и не обязательно более производительно чем ваш текущий подход.

Гораздо лучше подходить к настройке JSON анализа. JSON всегда следует анализировать в соответствующем аналоге вместо сохранения строк. Поэтому настройте свой синтаксический анализ так, чтобы он уже имел Date вместо String, и избавьте себя от необходимости работать с данными позже в своем коде. Это то, что должен делать маршаллинг, предоставляя вам простое (например) Java представление JSON для работы с ним, не беспокоясь о его происхождении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...