使用array [key] ++增加数组值

时间:2013-09-30 18:59:11

标签: java arrays for-loop increment

我的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()业务是否会导致业绩下降?有什么替代方案?

3 个答案:

答案 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。