我已经看到了这个问题并回答here,但我的用例是在创建过程中进行的。
我可以像这样创建一个多图:
ImmutableListMultimap<Foo, Bar> indexMultiMap = Multimaps.index(barCollection, new Function<Bar, Foo>() {
@Override
public Foo apply(Bar bar) {
//some works
return Foo;
}
});
我知道Foo元素将是唯一的,并且我希望按照此映射中每个Foo元素的Bar集合的每个Foo元素大小的频率对此映射进行排序,降序。
1)我怎么能用一次迭代做到这一点?就像在将此集合索引到MultiMap时这样做
2)如果不是这样,获得它的有效方法是什么?
我的目标是,当我迭代这张地图时,我想看到第一个键有更多的值,比如
Foo - &gt; 3(对应于此键的条形图集的大小)
Foo - &gt; 3
Foo - &gt; 2
Foo - &gt; 1
Foo - &gt; 1
答案 0 :(得分:1)
来自Multimaps.index()
的javadoc;
“在返回的多图中,按键按照首次遇到的顺序显示...”
如果集合以“模拟”隐式排序行为的方式排序,则将按您想要的顺序创建多图。例如:
SortedMultiset preSorted = TreeMultiset.create(fooComparator);
然后使用上面的preSorted集合提供Multimaps.index()
。
答案 1 :(得分:1)
正如@ px5x2所说。当您拨打Multimaps.index()
时,按键会按照首次遇到的顺序显示。所以,先对你的收藏品进行排序使用Guava Multimaps.index()
示例进行微小修改。
ImmutableSet<String> digits = ImmutableSet.of("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine");
Function<String, Integer> lengthFunction = new Function<String, Integer>(){
public Integer apply(String input) {
return input.length();
}
};
ImmutableMultimap<Integer, String> sortedOnLength = Multimaps.index(
Ordering.natural().onResultOf(lengthFunction).sortedCopy(digits),
lengthFunction
);