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

时间:2017-04-20 08:49:54

标签: java hashmap equals hashcode

我有import time import random def compute_optimal_weights(ids, prices): scaled_sum = 0 for i in ids: scaled_sum += prices[i] ** -0.25 result = {} for i in ids: result[i] = 0.67 * (prices[i] ** -0.25) / scaled_sum return result def compute_optimal_weights_old(input_sellers_ID, input_prices): input_weights_optimal = {} for i in input_sellers_ID: sum_price_ratio_scaled = 0 for j in input_sellers_ID: price_ratio = input_prices[i] / input_prices[j] scaled_price_ratio = price_ratio ** c1 sum_price_ratio_scaled += scaled_price_ratio input_weights_optimal[i] = c2 / sum_price_ratio_scaled return input_weights_optimal c1 = 0.25 c2 = 0.67 input_sellers_ID = range(10) input_prices = {i: random.uniform(0,1) for i in input_sellers_ID} start = time.clock() for _ in range(1000000): compute_optimal_weights_old(input_sellers_ID, input_prices) and None old_time = time.clock() - start start = time.clock() for _ in range(1000000): compute_optimal_weights(input_sellers_ID, input_prices) and None new_time = time.clock() - start print('Old:', compute_optimal_weights_old(input_sellers_ID, input_prices)) print('New:', compute_optimal_weights(input_sellers_ID, input_prices)) print('New algorithm is {:.2%} faster.'.format(1 - new_time / old_time)) ,其中HashMap为值。我想找不到。在ObjectObject中出现的所有那些在属性中具有某些定义值的值。例如。如下所述:

HashMap

我想在hashmap中找到name =“robert”的出现次数。 什么是最有效的方法。我可以不用循环来做,因为我的hasрmap非常大。

3 个答案:

答案 0 :(得分: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%左右。也就是说,如果(并且只有!)你反复这样做,平均而言,你的处理速度可以加倍。

答案 1 :(得分:0)

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

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

希望这个帮助

答案 2 :(得分:0)

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

String name = "robert";
int count = 0;
for(Employee theEmployee: emp.values()) {
  if (theEmployee.getName().equals(name)) {
      count++;
  }
}
编辑:我发现你的代码中有一些内容 - &gt;你像这样添加到哈希地图

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

不是

emp.add(1, E1);
emp.add(2, E2);
emp.add(3, E3);