Получение списка<Object> для каждого ключа из карты<String, List <Object >> (Java)

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

HashMap<String, List<Carrier>> carriers_list;

У меня уже есть собственный компаратор, настроенный для сравнения списка моих объектов.

static class CarrierComparator implements Comparator<Carrier> {
        @Override
        public int compare(Carrier c1, Carrier c2) {
            return c1.get_name().compareTo(c2.get_name());
        }
    }

Я могу использовать этот компаратор так:

List<Carrier> carrierList = getAllCarriers();
Collections.sort(carrierList, new CustomComparators.CarrierComparator());

Как я могу получить каждый список для каждого ключа на моей карте?

4 ответа

Решение

Вы можете перебирать значения карты:

CustomComparators.CarrierComparator comparator = new CustomComparators.CarrierComparator();
for (List<Carrier> l : carriers_list.values())
    Collections.sort(l, comparator);

Чтобы объединить все значения в один большой список:

List<Carrier> values = map.values().stream()
                                   .flatMap(List::stream)
                                   .collect(Collectors.toList());

Вы можете выполнить сортировку в том же выражении:

List<Carrier> values = map.values().stream()
                                   .flatMap(List::stream)
                                   .sorted(comparator)
                                   .collect(Collectors.toList());

То, что вы хотите сделать, это вокруг:

Map<Object,List<Object>> multimap = new HashMap<>();
    multimap.values().stream()                     // stream the values
    .flatMap(List::stream)                         // stream on the items in every list
    .sorted(CarrierComparator::compare)            // use your comparator
    .collect(Collectors.toList());                 // collect in a single List

Вот основной код, который показывает, как извлечь все объекты Carrier в один список, а затем отсортировать их.

Set<String> keys = map.keySet();
    List<Carrier> carriers = new ArrayList<Carrier>();
    for (String key : keys) {
        List<Carrier> temp = map.get(key);
        for (Carrier carrier : temp) {
            carriers.add(carrier);
        }
    }
    carriers.sort(new CarrierComparator());

"Носители" будут содержать отсортированный список объектов.

Другие вопросы по тегам