3

私は以下のような地図を持っています-

ConcurrentHashMap<Long, AtomicLong> histogram = new ConcurrentHashMap<Long, AtomicLong>();

このマップには、多くのキーと値のペアが含まれています。値としてを置くAtomicLongことが必要だったので、それが私がそのマップにそのように置いた理由です。

したがってConcurrentHashMap、上記のことを繰り返し実行しようとすると、常にこの行でエラーが発生します-

buckets[i] += histogram.get(time);

なので-The operator += is undefined for the argument type(s) int, AtomicLong

この問題を解決するにはどうすればよいですか?戻ってデータ構造をandIntegerではなくallに変更することはできません。LongAtomicLong

だから私はそれが動作し始めるように以下のコードで変更を加える方法を見つける必要があります。整数にキャストすることを考えていました。しかし、それも機能していませんでした。

以下は私のコードです

private static void logHistogramInfo() {

    System.out.println("From Main Thread: " + histogram);

    int[] definition = { 0, 20, 40, 60, 80, 100 };
    int[] buckets = new int[definition.length];

    for (Long time : histogram.keySet()) {
        for (int i = definition.length - 1; i >= 0; i--) {
            if (time >= definition[i]) {
                      //error on the below line
                buckets[i] += histogram.get(time);
                break;
            }
        }
    }
    for (int i = 0; i < definition.length; i++) {
        String period = "";
        if (i == definition.length - 1) {
            period = "greater than " + definition[i] + "ms";
        } else {
            period = "between " + (definition[i] + 1) + " and " + definition[i + 1] + "ms";
        }
        System.out.println(buckets[i] + " came back " + period);
    }

}
4

1 に答える 1

5

演算子は元々、プリミティブデータ型( 、...)+=で使用することを目的としていました。これらはマップに配置できないため、ラッパークラスが存在します。またはを任意の算術演算子とともに使用すると、これらは対応するプリミティブ型に自動的に「ボックス化解除」されます。intlongIntegerLong

ただし、に対応するプリミティブ型はありませんAtomicXYZ。ただし、Numberクラスが提供する任意のメソッドを使用して、その値をプリミティブとして取得できます(例:longValue()または)intValue()。アトミックロングの値は、原則として最大値int(またはInteger)よりも大きくなる可能性があるため、何らかの方法で潜在的なオーバーフローに対処する必要がある場合があります。

[編集]またはget()、assyliasが指摘するように(これまでアトミックタイプを使用したことがなかったので気づかなかった)メソッドを使用できます。これは、次のようlongValue()AtomicLong(およびと同じことintValue()AtomicInteger)実行します。その実装から。

于 2013-02-08T08:05:30.807 に答える