2014-01-28 34 views
1

我已经看到了这个问题并回答here,但我的用例是在创建过程中完成的。如何按每个键值的数量对Guava MultiMap进行排序

我可以创建这样一个多重映射:

ImmutableListMultimap<Foo, Bar> indexMultiMap = Multimaps.index(barCollection, new Function<Bar, Foo>() { 
    @Override 
    public Foo apply(Bar bar) { 
     //some works 
     return Foo; 
    } 
    }); 

我知道,富的元素将是独一无二的,我想对此映射进行排序每个美孚元素的酒吧集合中的每个富元件尺寸的频率)在这张地图中,降序。

1)我怎么可以做一个迭代?像这样做时,索引这个集合到MultiMap

2)如果不是这样,那么有效的方法是什么?

我的目标是不惜一切,当我遍历这个图,我希望看到的第一项具有值的大数目,像

美孚 - > 3(巴收集对应于这个密钥大小)

富 - > 3

富 - > 2

富 - > 1

富 - > 1

+0

您能否给我们提供样本输入代码? – Xaerxess

+0

@Xaerxess输入只是一个集合?你想看更多的东西? – oko

回答

1

来自javadoc的Multimaps.index();

“在返回的多重映射,键出现在他们首先出现的顺序......”

如果集合的方式,“模拟”隐性排序行为排序,多重映射将在创建你想要的订单。例如:

SortedMultiset preSorted = TreeMultiset.create(fooComparator); 

然后将Multimaps.index()与上述preSorted集合进行供给。

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 
); 
相关问题