2012-02-12 92 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