5

次の関数は、リストを再帰的にウォークスルーし、常に半分に分割して、サブリストで何かを実行します。リストサイズが2の場合、再帰は中断されます。リストを反復処理するときにリストを変更すると、同時変更例外が発生することがわかっています。しかし、私は反復を使用しません、そしてそれはまだ起こります:

    private static List<ParticipantSlot> divide(List<ParticipantSlot> list) {
        int n = list.size();

        //do something 

        if (n>2){
            List<ParticipantSlot> l = divide(list.subList(0, n/2-1));
            List<ParticipantSlot> r= divide(list.subList(n/2, n));

            l.addAll(r);
            return l;
        }else{
            return list;
        }
    }
4

3 に答える 3

10

addAll()引数で指定したコレクションを反復処理するを使用しています。これで、元のリストのビューsubListのみが返されるため、元のリストのビューに値を追加し、同時に元のリストの別の部分を反復処理しようとしています。バン。

毎回サブリストのコピーを作成した場合、それは機能するはずです-かなり非効率的ですが。

于 2012-01-05T15:12:25.127 に答える
4

サブリストは元のリストに基づいているため、同時変更例外が発生します。

返されたリストはこのリストによって裏付けられているため、返されたリストの非構造的な変更はこのリストに反映され、その逆も同様です。返されるリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートします。

例外を回避したい場合は、変更する前に最初のサブリストのコピーを作成してください。

于 2012-01-05T15:11:42.900 に答える
3

ArrayListを使用している場合は、CopyOnWriteArrayListまたはConcurrentLinkedQueueに変更することをお勧めします。

マルチスレッド環境を使用している場合はsynchronized、アレイを回避する必要があります。

それが役に立てば幸い。

于 2012-01-05T15:54:49.053 に答える