Группировать объекты в списке по нескольким параметрам - PullRequest
0 голосов
/ 23 января 2012

У меня есть сущность, которую нужно сгруппировать несколько раз по трем свойствам, которые обеспечивают более точный выбор слева направо. Допустим, у меня есть этот класс:

public class Person {
    private String gender;
    private String state;
    private String age;
}

Каждое свойство может содержать одно и то же значение несколько раз, и я хотел бы сгруппировать их соответствующим образом. Так что в итоге у меня следующая структура данных:

m --> France  --> 20 --> Person1
                         Person2
                  21 --> Person3
                         Person4
      Germany --> 20 --> Person5
                         ...

Я надеюсь, вы поняли идею. В настоящее время я использую глубоко вложенную Map конструкцию для достижения этой цели: Map<String, Map<String, Map<String, Person>>>

Затем я проверяю существующие ключи, как в этом ответе: Группировка по имени поля в Java для каждого уровня карты и, наконец, добавление моего объекта в «самую глубокую» карту.

Это должно работать, хотя еще не проверено, но есть ли лучший способ сделать это? Как в лучше читаемо или быстрее исполнение

Поскольку это всего один цикл for, время выполнения должно быть O (n) , что вполне нормально, но, тем не менее, это не лучшее решение.

Ответы [ 2 ]

0 голосов
/ 22 августа 2016

Если вам не нужна иерархия, вы можете использовать список и сортировать его 3 раза в обратном порядке критериев.Например, вы хотите, чтобы он был упорядочен по штату, возрасту, а затем по полу, а затем вам нужно сначала отсортировать по полу, затем по возрасту, а затем по состоянию.

Убедитесь, что ваш алгоритм сортировки стабилен, и порядок сортировки имеет одинаковую ценность.Записи не изменяются.

Если вы используете карту, лучше использовать более явные типы, чем строку.Возраст должен быть целочисленным, а пол - перечислением.State может быть enum или String, в зависимости от того, сколько у вас есть и сколько усилий вы хотите инвестировать.

0 голосов
/ 23 января 2012

Вы можете реализовать пользовательский Comparator, который сравнивает только нужные вам свойства и пропускает другие.Затем вы можете использовать Collections.sort(list, comparator) метод для сортировки объекта

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