2011-09-27 26 views
2

我已經創建了以下類型的hash多重映射:key作爲一對字符串,字符串和值。按計數過濾Guava HashMultimap鍵

HashMultimap<Pair<String, String>, Long> hm = HashMultimap.create(); 

我已經使用put函數在表格中插入了一些值。

現在我想找到所有那些有多個值的鍵。我想使用for循環遍歷所有鍵並找到具有多個值的鍵。請幫我,我該怎麼做?

回答

2
Set<Pair<String, String>> keysWithMultipleValues = Sets.newHashSet(); 

for (Pair<String, String> key : hm.keySet()) 
{ 
    if (hm.get(key).size() > 1) 
    { 
     keysWithMultipleValues.add(key); 
    } 
} 
+1

+1,不過我想你想'&& values.size()> 1'。該規範還說,你不需要檢查null;如果沒有映射,則返回空集合。 –

+0

@馬克你是對的 - 已經糾正。還指出'Multimap#get()'永遠不會返回'null' –

4

Matt已經涵蓋了程序方式。更多的功能的方法(還麻煩,因爲Java沒有關閉還)會是這樣的:

public class MoreThanOnePredicate<T extends Map.Entry<?, ? extends Collection<?>>> implements Predicate<T> { 
    public boolean apply(T entry) { 
     return entry.getValue().size() > 1; 
    } 
} 

//... 
return Maps.filterEntries(hm.asMap(), new MoreThanOnePredicate<Pair<String, String>, Collection<Long>>()).keySet(); 

我沒有圖書館,在我面前一個編譯器,也有可能是一些尚未解決的仿製藥那個問題。

2

這應該是多一點效率比馬特的版本,通過按鍵沒有查找使用:

Set<Pair<String, String>> r = Sets.newHashSet(); 
for(Entry<Pair<String, String>> e : create.keys().entrySet()) { 
    if(e.getCount() > 1) r.add(e.getElement()); 
}