如何轻松找到HasMap子集的大小,该大小在某些情况下返回true?计算Java HashMap的子集
比方说,我有这样的:
HashMap<Company, Revenue> results;
而且我想找到它的收入的公司数量为10
编辑:我想知道,如果Java有更好更快的解决方案,而不是for-loop。
如何轻松找到HasMap子集的大小,该大小在某些情况下返回true?计算Java HashMap的子集
比方说,我有这样的:
HashMap<Company, Revenue> results;
而且我想找到它的收入的公司数量为10
编辑:我想知道,如果Java有更好更快的解决方案,而不是for-loop。
你关心性能还是只需要一个答案?简单版本:
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++
}
}
由于映射通常是基于键的,因此基于值的操作通常是不合适的。
谢谢anser,只是更新了我的问题。 – 2012-02-12 00:46:47
尝试下面这段代码存储公司名单将提供整个公司的对象时,你需要做他们一些操作,而不是只是存储在一个变量的计数的
List<Company> comp = new ArrayList<Company>();
for(Company cp : results.keySet()){
if(results.get(cp).equals(10)){
comp.add(cp);
}
}
优势。
真的不认为有没有办法做到这一点没有循环的价值观。您可以使用另一个地图作为您想要搜索的值所键入的值,并包含Revenue对象列表。但是,这显然不是动态的,而且非常难看。
您可以使用Guava Multimap作为第二张地图。该地图将多个值与一个关键字相关联。因此,您可以反转您的当前地图并将收入用作关键字,并将多个公司与其关联。
之后,您可以很容易地获得一定收入的所有公司。
ListMultimap<Revenue, Company> revenue2Companies = ArrayListMultimap.create();
Revenue rev = ...;
List<Company> companies = revenue2Companies.get(rev);
请务必仔细阅读你将使用实施的javadoc。对于用作键的类,您很可能必须实施适当的方法equals
。
一个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
循环快得多。
此外,@FabianBarney,您发布到Multimap文档的链接非常旧 - 发布3,而番石榴现在在发布11! (我链接到Guava用户指南/维基,您可能没有看到。) – 2012-02-12 16:23:04
谢谢,更新了我的文章。 – 2012-02-12 18:36:38
@FabianBarney的答案为您提供了最一般的解决方案。您需要一个倒排索引,并且由于每个键(收入)可以有多个值,因此您需要一个MultiMap数据结构。编写自己的代码并不难,但是可以使用Guava实现,为什么要重新发明轮子。 – 2012-02-12 01:27:36