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);

これで、反復ごとに正確に 1getつの操作が行われます。put

于 2013-09-30T19:01:48.483 に答える
1

できるだけ効率的にするために私が通常これを行う方法は次のとおりです。

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

これは私にとって非常にきれいで、contains からすでにそこにあることがわかった後、val を「取得」するための余分なハッシュ ルックアップを回避します。

于 2013-09-30T19:05:24.433 に答える