1

マップが次のように定義されている場合

private Map<Integer, Integer>   map = new HashMap<Integer, Integer>();

キーの更新は、以下に示すように正常に機能します

public void increaseCountInFile(Integer hashCode) {
    if (mapContains(hashCode)) {
        increaseCount(hashCode);
    } else {
        map.put(hashCode, 1);
    }
}

private void increaseCount(Integer fileHashCode) {
    Integer key = map.get(fileHashCode);
    map.remove(fileHashCode);
    map.put(fileHashCode, ++key);
}

private boolean mapContains(Integer fileHashCode) {
    return map.containsKey(fileHashCode);
}

しかし、マップから要素を削除せずに同じことができるのだろうか?(map.remove(fileHashCode);

++(map.get(fileHashCode));見た目は良いですが、Javaはそれが好きではありません

4

3 に答える 3

3

@tskuzzyの答えよりも少し効率的です。これは、ルックアップを1回だけ実行します。

public void increaseCountInFile(Integer hashCode) {
    Integer prev = map.get(hashCode);
    if (prev == null) prev = 0;
    map.put(hashCode, prev + 1);
}

TIntIntHashMapを使用すると、オブジェクトの使用や前の値の確認を回避できます。

public void increaseCountInFile(int hashCode) {
    map.adjustValue(hashCode, 1, 1);
}
于 2012-06-14T17:13:06.727 に答える
3

あなたは必要ありません

map.remove(fileHashCode);

put()エントリが自動的に上書きされます。increaseCount()次のようにメソッドを短縮できます。

private void increaseCount(Integer fileHashCode) {
    map.put(fileHashCode, map.get(fileHashCode)+1);
}

正直なところ、コードに抽象化を追加しすぎていると思います。他に非常に正当な理由がない限り、これは実際には1つの方法にすぎません。

public void increaseCountInFile(Integer hashCode) {
    if(map.containsKey(hashCode)) {
        map.put(hashCode, map.get(hashCode)+1);
    } else {
        map.put(hashCode, 1);
    }
}
于 2012-06-14T17:04:53.330 に答える
1

マップのキーと値はオブジェクト(Integerこの場合)であるため、++は機能しません。ただし、最初put()に呼び出さなくても使用できremove()、結果は指定されたキーの値が上書きされます。

于 2012-06-14T17:07:02.403 に答える