有效的方法来查找对象的一些属性值的发生没有作为哈希值的值
问题描述:
我有一个HashMap
它有Object
作为值。我想找不到。在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中出现的位置number =“robert”。 什么是最有效的方式来做到这一点。我可以做到没有循环,因为我的hasmapmap非常大。
答
我不认为是可能的,除非你创建了一种顺序。例如,如果您将键名按升序排列,并且值按字典顺序排列,则可以使用辅助搜索算法将名称按复杂度O(log2(n))排序。
其他的解决办法是dinamically保存于其他结构的这种信息来获得更迅速,像一个哈希地图,键名,和值出现
希望这有助于
答
接听无循环部分,不是那么多最有效的方式部分:您可以使用Java 8 Streams不使用循环来实现它,但这并不会使它本身更有效。
从理论上讲,如果Map非常大,并行化可能会有所帮助。虽然在这种情况下,它不太可能,因为filter
Predicate在计算上非常便宜。
无论如何,使用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%。那就是如果(并且只有在!)你一遍又一遍地平均来说,你可以将你的处理速度提高一倍。
答
一个简单的方法,你可以尝试(但不是最好的)
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);
添加仅供参考。不用于实际的代码。但在上面提出的答案中,for循环仍在进行。我如何避免循环,因为我的Hashmap非常大? – Ashutosh