Sort keys of multimap by highest value they contain

guava, java, multimap, sorting

Solution

If I were you, I'd start by not using a `Multimap`, but rather, using a `Map` to track the greatest value associated with each key. Then, you have a `Map<String, Integer>`, and if you don't need to save the `Map` afterwards, then I'd do something like

final Map<String, Integer> map = ...
return Ordering.natural().onResultOf(Functions.forMap(map)).reverse()
          // a comparator to compare strings in descending order of their
          // associated values
       .immutableSortedCopy(map.keySet());

To unpack a bit:

Ordering.natural() // the natural ordering on integers
  .onResultOf(
     Functions.forMap(map) // use the Map<String, Integer> as a Function
     // this ordering now compares Strings by the natural ordering of
     // the integers they're mapped to
  .reverse(); // reverses the ordering, so it now sorts in descending order

Problem

I using a Guava MultiMap (impl LinkedListMultimap) to allow me to store multiple values for a key, but then I want to sort the map by the highest value and return the keys. i.e After first run I have ``` key1:{13} key2:{7} key3:{11} ``` After second run I now have ``` key1:{13,14} key2:{7,18} key3:{11,1} ``` After third run I now have ``` key1:{13,14,16} key2:{7,18,6} key3:{11,1,22} ``` I want an order of ``` key3 key2 key1 ``` and I want to output the keys (I dont need to know the values any longer) I cant work out a way to do that, I dont have to use MultiMap it just looked like it might help

Original source