有效的方法来查找对象的一些属性值的发生没有作为哈希值的值

有效的方法来查找对象的一些属性值的发生没有作为哈希值的值

问题描述:

我有一个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); 
+0

添加仅供参考。不用于实际的代码。但在上面提出的答案中,for循环仍在进行。我如何避免循环,因为我的Hashmap非常大? – Ashutosh