从 Map<String, List<Object>> (Java) 中获取每个键的 List<Object>

Getting the List<Object> for every key out of a Map<String, List<Object>> (Java)

我需要对每个值中包含多个对象的 Map 的每个值进行排序,但我正在努力了解如何进行排序。我的地图如下所示:

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());

如何获取地图中每个键的每个列表?

你想做的是:

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

您可以迭代地图的值:

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());

下面是一段基本代码,展示了如何将所有 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());

"carriers" 将包含排序的对象列表。