按照包含的最高值对多图的键进行排序

时间:2012-10-18 16:28:26

标签: java sorting guava multimap

我使用Guava MultiMap(impl LinkedListMultimap)来允许我为一个键存储多个值,但是我想按最高值对地图进行排序并返回键。

第一次跑完后我有

key1:{13}
key2:{7}
key3:{11}

第二次跑步后我现在有了

key1:{13,14}
key2:{7,18}
key3:{11,1}

第三次跑完后我现在有了

key1:{13,14,16}
key2:{7,18,6}
key3:{11,1,22}

我想订购

key3
key2
key1

我想输出密钥(我不再需要知道这些值)

我无法找到一种方法来做到这一点,我不必使用MultiMap它看起来可能会有所帮助

2 个答案:

答案 0 :(得分:5)

如果我是你,我首先不使用Multimap,而是使用Map来跟踪与每个关键字相关联的最大值。然后,您有一个Map<String, Integer>如果之后您不需要保存Map,那么我会做

之类的事情
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());

要解压缩一下:

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

答案 1 :(得分:2)

我要做的是将entrySet粘贴到带有自定义比较器的TreeSet中。然后拿出钥匙。

sortedEntries = Sets.newTreeSet(comparator).addAll(multimap.entries());
return Collections2.transform(sortedEntries, keyExtractor);

keyExtractor,比较器和参数化的实现留给读者练习。