我有一个HashMap
,其中有Object
值。我想找不到。所有那些在Object
值中出现的HashMap
,它在属性上有一定的价值。例如。如以下所说的 :
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中找到name =“robert”的出现次数。什么是最有效的方法。我可以没有循环这样做,因为我的hasрmap非常大。
回答无循环部分,而不是最有效的方式部分:你可以在没有使用Java 8 Streams的循环的情况下完成它,但这本身并没有使它更有效。
理论上,如果Map非常大,并行化可能会有所帮助。虽然在这种情况下它不太可能,因为filter
谓词在计算上真的很便宜。
无论如何,使用Java 8 Streams很容易实现并行化。假设您的Employee类有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个条目的HashMap测量的四核I7上做了一个小测试。
针对for
循环方法的改进始终为约50%。也就是说,如果(并且只有!)你反复这样做,平均而言,你的处理速度可以加倍。
除非你创造一种秩序,否则我认为是不可能的。例如,如果您将名称放在按键升序的位置,并且值按字典顺序排列,则可以使用复杂的O(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);