计算Java HashMap的子集

计算Java HashMap的子集,java,map,dataset,hashmap,Java,Map,Dataset,Hashmap,如何轻松找到在某些条件下返回true的HasMap子集的大小 假设我有这个: HashMap<Company, Revenue> results; HashMap结果; 我想找出收入为10的公司的数量 编辑:我想知道java是否有比for循环更好更快的解决方案 您关心性能,还是只需要一个答案?简单版本: int count = 0; for (Revenue r : results.values()) { if (r.equals(10)) { // I'm not sure

如何轻松找到在某些条件下返回true的HasMap子集的大小

假设我有这个:

HashMap<Company, Revenue> results;
HashMap结果;
我想找出收入为10的公司的数量


编辑:我想知道java是否有比for循环更好更快的解决方案

您关心性能,还是只需要一个答案?简单版本:

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++
  }
}

由于映射通常基于键,因此基于值的操作通常效率低下。

请尝试以下代码

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

将公司存储在列表中的优点是,当您需要对公司对象执行某些操作时,可以使用整个公司对象,而不仅仅是将计数存储在变量中。

真的不认为有一种方法可以在不循环值的情况下实现这一点。您可以使用另一个映射作为值,该值由要搜索的值键入,并包含收入对象列表。然而,这显然不是动态的,而且相当丑陋

您可以使用a作为第二个贴图。此映射将多个值与一个键关联。因此,您可以反转当前地图,将收入作为关键,并将多家公司与之关联

之后,你可以很容易地得到所有公司的一定收入

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

List<Company> companies = revenue2Companies.get(rev);
ListMultimap revenue2companys=ArrayListMultimap.create();
收入修订=。。。;
上市公司=收益公司2.get(rev);
请务必阅读您将要使用的实现的javadoc。对于用作键的类,您很可能必须实现适当的
equals
方法。

A可能是最简单的解决方案,但它比@Fabian Barney建议的更简单

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>
SetMultimap companysbyrevenue=
Multimaps.invertFrom(Multimaps.forMap(results),HashMultimap.create());
//以多重映射的形式查看结果,然后将键/值关系反转为
//查找与每个值关联的所有键
return companies by evenue.get(Desiredevenue);//设置

也就是说,如果您需要使用不同的收入进行多个查询,那么这只比标准的
for
循环快。如果您只需要查找具有一个特定收入值的公司,没有比简单的
for
循环更快的解决方案了。

@FabianBarney的答案为您提供了最通用的解决方案。您需要一个反向索引,因为每个键(收入)可以有多个值,所以您需要一个MultiMap数据结构。编写自己的文档并不难,但是有了Guava实现,为什么要重新发明轮子呢?还有,@FabianBarney,你发布到Multimap文档的链接非常古老——第3版,而Guava现在是第11版!(我链接到了Guava用户指南/wiki,您可能没有看到。)