Java 查找对象中某个属性值不作为hashmap值出现的有效方法

Java 查找对象中某个属性值不作为hashmap值出现的有效方法,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,我有一个HashMap,它的值是Object。我想在HashMap值中查找所有出现的Object,该值在属性中有一些定义值。例如,如下所述: class Employee{ private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; } } Map<Integer

我有一个
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);
class员工{
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
Map emp=newhashmap();
环境管理局增补(1,E1);
环境管理局增补(2,E2);
我想在hashmap中查找出现的次数,其中name=“robert”。
最有效的方法是什么。我可以不使用循环,因为我的hasömap非常大。

我认为这是不可能的,除非你创建一种顺序。例如,如果将名称放在键按升序排列、值按字典顺序排列的位置,则可以使用二进制搜索算法按复杂度为O(log2(n))的顺序排列名称

另一种解决方案是将此类信息以更快速的方式保存在其他结构中,比如哈希映射,其中键是名称,值是引用


希望这有帮助,我认为这是不可能的,除非你建立一种秩序。例如,如果将名称放在键按升序排列、值按字典顺序排列的位置,则可以使用二进制搜索算法按复杂度为O(log2(n))的顺序排列名称

另一种解决方案是将此类信息以更快速的方式保存在其他结构中,比如哈希映射,其中键是名称,值是引用

希望这有助于回答无循环部分,而不是最有效的方法部分:您可以使用Java8流进行无循环操作,但这本身并不能提高效率

从理论上讲,如果地图真的很大,并行化可能会有所帮助。虽然在这种情况下,这不太可能,因为
过滤器
谓词在计算上非常便宜

无论如何,使用Java8流很容易实现并行化。 假设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();
Map emp=newhashmap();
String name=“robert”;
长计数=emp.values()
.parallelStream()
.filter(e->name.equals(e.getName()))
.count();
编辑

对于并行流可能带来的运行时改进,我似乎有点过于悲观了。我在四核I7上做了一个小测试,用一个包含750_000个条目的HashMap进行测量

for
循环方法相比,持续改善约50%。这就是如果(而且只有当!)你反复这样做,平均来说,你的处理速度可以提高一倍。

回答无循环部分,而不是最有效的方法部分:你可以使用Java8流无循环地完成,但这本身并没有使它更有效

从理论上讲,如果地图真的很大,并行化可能会有所帮助。虽然在这种情况下,这不太可能,因为
过滤器
谓词在计算上非常便宜

无论如何,使用Java8流很容易实现并行化。 假设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();
Map emp=newhashmap();
String name=“robert”;
长计数=emp.values()
.parallelStream()
.filter(e->name.equals(e.getName()))
.count();
编辑

对于并行流可能带来的运行时改进,我似乎有点过于悲观了。我在四核I7上做了一个小测试,用一个包含750_000个条目的HashMap进行测量


for
循环方法相比,持续改善约50%。也就是说,如果(而且只有当!)你反复这样做,平均来说,你可以将处理速度提高一倍。

一个简单的方法你可以尝试(但不是最好的)

编辑:我注意到你的代码中有一些东西->你添加到hashmap中,如下所示

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


一个简单的方法你可以尝试(但不是最好的)

编辑:我注意到你的代码中有一些东西->你添加到hashmap中,如下所示

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


那只不过是参考而已。在实际代码中未使用。但在上面提出的答案中,for循环仍在继续。我的Hashmap非常大,如何避免循环呢?那个add仅供参考。在实际代码中未使用。但在上面提出的答案中,for循环仍在继续。我的Hashmap非常大,如何避免循环?