如何通过计算每个键的值来对Guava MultiMap进行排序

时间:2014-01-28 07:38:34

标签: java sorting guava multimap

我已经看到了这个问题并回答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

2 个答案:

答案 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
);