2012-02-12 89 views
1

如何輕鬆找到HasMap子集的大小,該大小在某些情況下返回true?計算Java HashMap的子集

比方說,我有這樣的:

HashMap<Company, Revenue> results; 

而且我想找到它的收入的公司數量爲10

編輯:我想知道,如果Java有更好更快的解決方案,而不是for-loop。

+0

@FabianBarney的答案爲您提供了最一般的解決方案。您需要一個倒排索引,並且由於每個鍵(收入)可以有多個值,因此您需要一個MultiMap數據結構。編寫自己的代碼並不難,但是可以使用Guava實現,爲什麼要重新發明輪子。 – 2012-02-12 01:27:36

回答

0

你關心性能還是隻需要一個答案?簡單版本:

int count = 0; 
for (Revenue r : results.values()) { 
    if (r.equals(10)) { // I'm not sure what your revenue class is, exactly. Add appropriate comparison here. 
    count++ 
    } 
} 

由於映射通常是基於鍵的,因此基於值的操作通常是不合適的。

+0

謝謝anser,只是更新了我的問題。 – 2012-02-12 00:46:47

0

嘗試下面這段代碼存儲公司名單將提供整個公司的對象時,你需要做他們一些操作,而不是隻是存儲在一個變量的計數的

List<Company> comp = new ArrayList<Company>(); 
for(Company cp : results.keySet()){ 
    if(results.get(cp).equals(10)){ 
    comp.add(cp); 
    } 
} 

優勢。

0

真的不認爲有沒有辦法做到這一點沒有循環的價值觀。您可以使用另一個地圖作爲您想要搜索的值所鍵入的值,幷包含Revenue對象列表。但是,這顯然不是動態的,而且非常難看。

1

您可以使用Guava Multimap作爲第二張地圖。該地圖將多個值與一個關鍵字相關聯。因此,您可以反轉您的當前地圖並將收入用作關鍵字,並將多個公司與其關聯。

之後,您可以很容易地獲得一定收入的所有公司。

ListMultimap<Revenue, Company> revenue2Companies = ArrayListMultimap.create(); 
Revenue rev = ...; 

List<Company> companies = revenue2Companies.get(rev); 

請務必仔細閱讀你將使用實施的javadoc。對於用作鍵的類,您很可能必須實施適當的方法equals

1

一個GuavaMultimap可能是最簡單的解決方案,但它更容易比@Fabian巴尼表明...

SetMultimap<Revenue, Company> companiesByRevenue = 
    Multimaps.invertFrom(Multimaps.forMap(results), HashMultimap.create()); 
// view results as a Multimap, and then invert the key/value relationship to 
// find all keys associated with each value 
return companiesByRevenue.get(desiredRevenue); // Set<Company> 

那說,這只是比標準for循環更快,如果你需要做具有不同收入的多個查詢。如果您只需查看具有特定收入價值的公司,則無法比簡單的for循環快得多。

+0

此外,@FabianBarney,您發佈到Multimap文檔的鏈接非常舊 - 發佈3,而番石榴現在在發佈11! (我鏈接到Guava用戶指南/維基,您可能沒有看到。) – 2012-02-12 16:23:04

+0

謝謝,更新了我的文章。 – 2012-02-12 18:36:38