我的Java代码:
if(wins.containsKey(winner)) {
int currentCount = wins.get(winner);
wins.remove(winner);
wins.put(winner, currentCount + 1);
} else {
wins.put(winner, 1);
}
这是我在PHP甚至C#中可以做的事情的替代方法:
if(isset($something[$key])) {
$something[$key]++;
} else {
$something[$key] = 1;
}
这将在for循环中的大量迭代中使用,所以我想考虑性能。整个remove()
然后puts()
业务是否会导致业绩下降?有什么替代方案?
答案 0 :(得分:5)
您的代码可以替换为:
if(wins.containsKey(winner)) {
wins.put(winner, wins.get(winner) + 1);
} else {
wins.put(winner, 1);
}
无需删除条目。当您使用相同的键在地图中添加另一个条目时,它将覆盖现有的条目。
答案 1 :(得分:1)
首先,我强烈怀疑这不会成为性能瓶颈。与以往一样, test 是在使用更复杂的代码之前最简单的代码。
您可以使用AtomicInteger
代替Integer
作为地图的值类型。这将允许您改变包装的值,而不是替换整个条目。然后你就有了:
if(wins.containsKey(winner)) {
wins.get(winner).incrementAndGet();
} else {
wins.put(winner, new AtomicInteger(1));
}
如果可以坚持使用Integer
,您仍然可以进一步优化代码:
Integer previousValue = wins.get(winner);
int newValue = previousValue == null ? 1 : (int) previousValue + 1;
wins.put(winner, newValue);
现在每次迭代只有一个get
和一个put
操作。
答案 2 :(得分:1)
我通常这样做的方式是尽可能高效:
Integer val = wins.get(winner);
wins.put(winner,val == null ? 1 : (val + 1));
这对我来说非常干净,并且避免额外的哈希查找,以便在知道它已经存在于包含之后“获取”val。