我使用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它看起来可能会有所帮助
答案 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,比较器和参数化的实现留给读者练习。