0

我的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()商业扼杀了表现吗?什么是替代方案?

4

3 回答 3

5

您的代码可以替换为:

if(wins.containsKey(winner)) {
    wins.put(winner, wins.get(winner) + 1);
} else {
    wins.put(winner, 1);
}

无需删除条目。当您在地图中添加另一个具有相同键的条目时,它将覆盖现有的条目。

于 2013-09-30T19:00:32.280 回答
1

首先,我强烈怀疑这不会成为性能瓶颈。与以往一样,在使用更复杂的代码之前测试最简单的代码。

您可以使用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操作。

于 2013-09-30T19:01:48.483 回答
1

我通常这样做以尽可能高效的方式是:

Integer val = wins.get(winner);
wins.put(winner,val == null ? 1 : (val + 1));

这对我来说非常干净,并且在您知道它已经从包含中存在之后避免了额外的哈希查找来“获取” val。

于 2013-09-30T19:05:24.433 回答