0

Guavaテーブルを使用し、時々スローするコードを読んでいますConcurrentModificationException- テーブルの列を繰り返し処理し、同じループでテーブルを変更しているため、これは理解できます。これを解決するクリーンでパフォーマンスの高い方法はありますか? put の前に table.remove を実行して、それが機能することを期待できますか?

final Set<Optional<SimpleWorkDataValue>> columnKeys = table.columnKeySet();
for (final SimpleWorkDataValue timeSeriesValue : timeSeriesValues) {
    final Optional<SimpleWorkDataValue> rowKey = Optional.of(timeSeriesValue);
    for (final Optional<SimpleWorkDataValue> columnKey : columnKeys) {
        if (!table.contains(rowKey, columnKey)) {
            table.put(rowKey, columnKey, ResultSet.EMPTY);
        }
    }
}
4

2 に答える 2

4

ネストされたループの通常の実行に含まれる行、列、セルの数によっては、次のコード行で暗黙的にインスタンス化される Iterator を除外することで、メモリを節約できる可能性があります。

    for (final Optional<SimpleWorkDataValue> columnKey : columnKeys) {

この Iterable は手順全体を通して変更されないため、最初に列キーを List にコピーし、代わりに内側のループでそれを反復処理できます。

    final List<Optional<SimpleWorkDataValue>> columnKeyList =
        ImmutableList.copyOf(table.columnKeySet());
    for (final SimpleWorkDataValue timeSeriesValue : timeSeriesValues) {
        final Optional<SimpleWorkDataValue> rowKey = Optional.of(timeSeriesValue);
        for (final Optional<SimpleWorkDataValue> columnKey : columnKeyList) {
            if (!table.contains(rowKey, columnKey)) {
                table.put(rowKey, columnKey, ResultSet.EMPTY);
            }
        }
    }

もちろん、これによりすべての ConcurrentModificationExceptions が排除されます。

于 2013-04-03T23:54:34.423 に答える