9

2つのリスト間の共通部分を取得する方法をテストしたかったのですが、これが私のコードです:

            List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
        List<Integer> list2 = list.subList(2, 5);

        System.out.println(list.subList(2, 5));
        System.out.println(list.containsAll(list.subList(2, 5)));
        System.out.println(list.retainAll(list2));

これは以下を生成します:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(Unknown Source)
    at java.util.AbstractList$Itr.remove(Unknown Source)
    at java.util.AbstractCollection.retainAll(Unknown Source)
    at gov.noaa.nhc.App.main(App.java:48)

しかし、私は削除を行っていません。なぜこれが例外を生み出すのですか?

更新I:

使用:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = list.subList(2, 5);

生産:

java.util.ConcurrentModificationException

list2はlist1に支えられているため、list1からアイテムを削除するとこの例外が発生します。最終的に動作するバージョン:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = Arrays.asList(18, 19, 20);

また

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20));

また

 List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
 List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));

みなさん、ありがとうございました。

4

5 に答える 5

26

を使用するArrays.asListと、機能が制限されて渡された実際の配列に基づくリストが取得されます。完全に変更可能なリストが必要な場合は、新しいリストを作成する必要があります。例えば:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
list.retainAll(list2);
System.out.println(list);
// result: [18, 19, 20]
于 2012-05-10T20:34:43.023 に答える
3

ドキュメントが言うように、List.retainAll()メソッド

指定されたコレクションに含まれるこのリストの要素のみを保持します (オプションの操作)。つまり、指定されたコレクションに含まれていないすべての要素をこのリストから削除します。[鉱山を強調]

于 2012-05-10T20:34:09.217 に答える
1

keepAllは、呼び出されたリストからアイテムを削除します。

于 2012-05-10T20:32:54.040 に答える
0

keepAll は、指定されたリストにないすべての要素を削除します。

于 2012-05-10T20:33:52.447 に答える
0

ドキュメントには、List 実装がこのメソッドをサポートしていない場合、retainAll が UnsupportedOperationException をスローすることも記載されています。

于 2012-05-10T20:38:19.200 に答える