2011-10-25 12 views
68

私は、コレクションc1<MyClass>と配列a<MyClass>を持っています。配列をコレクションc2に変換しようとしていますが、c1.removeAll(c2)を実行しますが、これはUnsupportedOperationExceptionをスローします。私は、配列クラスのasList()Arrays.ArrayListクラスを返し、removeAll()AbstractList()から継承し、その実装はUnsupportedOperationExceptionをスローすることがわかりました。Arrays.asList()によって作成されたリストのremove()throws UnsupportedOperationException

Myclass la[] = getMyClass(); 
    Collection c = Arrays.asList(la); 
    c.removeAll(thisAllreadyExistingMyClass); 

要素を削除する方法はありますか?助けてください

+0

関連する質問ですthis.I希望を試すことができます。http://stackoverflow.com/questions/2965747/why-i-get-サポートされていない操作の例外 - リストから削除しようとしたとき – Ram

答えて

119

Arrays.asListは、配列の周りにListラッパーを返します。このラッパーは固定サイズで、配列に直接バッキングされているため、setを呼び出すと配列が変更され、リストを変更するその他のメソッドはUnsupportedOperationExceptionを投げます。

これを修正するには、ラッパーリストの内容をコピーして新しい変更可能なリストを作成する必要があります。これはCollectionを取るArrayListコンストラクタを使用して行うのは簡単です:

Collection c = new ArrayList(Arrays.asList(la)); 
+11

+1は実際には変更不可能ではないことを指摘します。 –

+0

はい、set()は例外をスローしません – javalearner

+0

'java.util.Arrays'' asList() 'メソッドのソースコードを見ていて、' ArrayList'を返すようです。しかし、 'System.out.println(list.getClass());'を実行すると、 'class java.util.Arrays $ ArrayList'を取得します。したがって、 'add 'メソッドや' remove'メソッドを持たない内部の 'ArrayList'クラスを使います。 'java.util.ArrayList'を使うのではなく、' add() 'と' remove() 'メソッドを持たないのはなぜでしょうか? – Abdul

13

うん、それは元の配列によってバックアップされているためArrays.asList(..)が拡大または縮小することができないコレクション(で、それができます」サイズ変更することはできません)。

あなたは要素を削除いずれかnew ArrayList(Arrays.asList(..)を作成したり、配列から直接要素を削除する場合(つまり、あまり効率的で書くことが難しくなります)

+0

+1この答えは唯一正しいものです:配列。asList()は、変更不可能な*リストを返します。これが例外をスローします。それは、 "配列に裏打ちされた"などとは何の関係もありません。* all * ArrayListsは、配列で支持されています。 – Bohemian

+0

@ボヘミアンおそらく、あなたの要件を満たしていると思うので、私の答えをもう一度読んでください。 –

+0

すべての配列は固定サイズです!あなたの答えは無関係な情報しか提供していません – Bohemian

6

それが直接に裏打ちされているので、仕方Array.asList()作品ですアレイ。 完全に変更可能なリストを取得するには、コレクションを自分で作成したコレクションに複製する必要があります。

Collection c = new ArrayList(Arrays.asList(la)) 
+1

リストは変更可能ですが、set()を通してのみです。返されるコレクションは固定サイズです。 – javalearner

+0

私はそれが変更不可能だとは決して言わなかった。ちょうど、(完全に)変更可能なリストを取得するには、 'ArrayList'を使う必要があります。違いはあまりにも明らかではありませんでした。 :-)リストが変更可能かどうかは定義の問題ですが、それは「半修正可能」ですが、私の見解では完全に変更できません。 – henko

-2

このエラーを修正するには、また、これは便利

List<ChunkId> idList = new ArrayList<>(); 
    idList.addAll(Arrays.asList(ids.toArray(new ChunkId[0]))); 
関連する問題