有效的方法是在对象中找不到某些属性值的出现,作为hashmap的值

问题描述 投票:0回答:3

我有一个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 hashmap equals hashcode
3个回答
2
投票

回答无循环部分,而不是最有效的方式部分:你可以在没有使用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%。也就是说,如果(并且只有!)你反复这样做,平均而言,你的处理速度可以加倍。


0
投票

除非你创造一种秩序,否则我认为是不可能的。例如,如果您将名称放在按键升序的位置,并且值按字典顺​​序排列,则可以使用复杂的O(log2(n))和旁路搜索算法按顺序放置和获取名称。

其他解决方案是在其他结构中动态保存这种信息以获得更快的速度,例如键是名称的哈希映射,值是出现的

希望这有帮助


0
投票

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.