i具有Object
作为值的HashMap
。我想找到不。在HashMap
中Object
的所有出现中,在属性中具有某些定义值。例如。下面提到:
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);