有效的方法是在对象中找到某些属性值的事件作为hashmap的值



i具有Object作为值的HashMap。我想找到不。在HashMapObject的所有出现中,在属性中具有某些定义值。例如。下面提到:

class Employee{
    private String name;
    public String getName(){
     return name;
    }
    public void setName(String name){
     this.name = name;
    }
}
Map<Integer, Employee> emp = new HashMap<Integer, Employee>();
emp.add(1, E1);
emp.add(2, E2);

我想在hashmap中找到姓名=" robert"的出现数量。什么是最有效的方法。我可以在没有循环的情况下做到这一点,因为我的hasumap很大。

在没有循环的情况下回答,而不是最有效的方法 part:您可以使用Java 8 streams而无需循环的情况但这本身本身并没有更有效

从理论上讲,如果地图确实很大,则可以帮助并行化。尽管在这种情况下,由于filter谓词在计算上确实很便宜。

无论如何,Java 8流很容易实现并行化。假设您的员工类具有getName()方法,您可以尝试类似的东西

Map<Integer, Employee> emp = new HashMap<Integer, Employee>();
String name = "robert";
long count = emp.values()
        .parallelStream()
        .filter(e -> name.equals(e.getName()))
        .count();

编辑

对于由于平行流而导致的潜在运行时改进,我似乎太悲观了。我对使用包含750_000条目的哈希图测量的四核i7进行了一个小测试。

针对for环路方法的改进始终约为50%。那就是(只有!

我认为不可能,除非您创建一种订单。例如,如果将钥匙的名称放在升序上,值按词典顺序排列,则可以用bynary搜索算法的复杂性(log2(n((按顺序进行命名。

其他解决方案是在其他结构中保存意剂,以更快地获取,例如键是名称的哈希地图,并且值是出现

希望此帮助

您可以尝试(但不是最好的(

的一种简单方法
String name = "robert";
int count = 0;
for(Employee theEmployee: emp.values()) {
  if (theEmployee.getName().equals(name)) {
      count++;
  }
}

编辑:我注意到您的代码中的某些内容 ->您将其添加到hashmap中

emp.put(1, E1);
emp.put(2, E2);
emp.put(3, E3);

不是

emp.add(1, E1);
emp.add(2, E2);
emp.add(3, E3);

最新更新