-2

I need to sort every value of a Map with multiple objects in each value, but I am struggling to see how. My Map looks like this:

HashMap<String, List<Carrier>> carriers_list;

I already have a Custom Comparator set up to compare a List of my objects.

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

I can use this Comparator like so:

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

How can I get each List for every key in my Map?

Johannes Mols
  • 890
  • 1
  • 12
  • 35

4 Answers4

4

To get all the values combined in one big list:

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

You can do the sorting in the same expression:

List<Carrier> values = map.values().stream()
                                   .flatMap(List::stream)
                                   .sorted(comparator)
                                   .collect(Collectors.toList());
khelwood
  • 55,782
  • 14
  • 81
  • 108
1

What you want to do is around the likes of :

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
Jeremy Grand
  • 2,300
  • 12
  • 18
1

You can iterate over the map's values:

CustomComparators.CarrierComparator comparator = new CustomComparators.CarrierComparator();
for (List<Carrier> l : carriers_list.values())
    Collections.sort(l, comparator);
Stefan Warminski
  • 1,845
  • 1
  • 9
  • 18
0

Here is a basic code which shows how to extract all Carrier objects into one list and then sort them.

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" will contain sorted list of objects.

Prashant
  • 153
  • 9