Получение списка<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());
"Носители" будут содержать отсортированный список объектов.