2014-01-28 54 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 
); 
相關問題