2012-05-17 12 views
7

私のリストから特定の要素を削除したい。私はリストを反復しながらこれをやりたくない。私は削除する必要がある値を指定したい。 javadocで、私はこれが私のコードである機能List.remove(Object 0)が見つかりました:リストから値を削除する<String>がjavaをスローするjava.lang.UnsupportedOperationException

  String str="1,2,3,4,5,6,7,8,9,10"; 
     String[] stra=str.split(","); 
     List<String> a=Arrays.asList(stra); 
     a.remove("2"); 
     a.remove("3"); 

しかし、私は例外を取得します:java.lang.UnsupportedOperationException

答えて

22

問題はArrays.asList()が挿入/削除をサポートしていないリストを返すということである(それは単にですビューstra)。これは、あなたがそれを修正することができ、リストのコピーを作成します

List<String> a = new ArrayList<String>(Arrays.asList(stra)); 

:に

List<String> a = Arrays.asList(stra); 

:、変更を修正するには

+0

これは機能します。ありがとう私の方法で何が間違っていた。リスト a = Arrays.asList(stra);この行に例外はスローされませんでした。 – Ashwin

+0

@Ashwin:その行は大丈夫でした。ただし、 'Arrays.asList()'によって生成されるリストは読み取り専用であるため、変更することはできません。まずコピーを作成する必要があります。 – NPE

+0

大丈夫です..私の方法では、文字列[]の値に直接アクセスするだけのリストがありました。だからもし何か変更が許されれば、String []にも影響しますか? – Ashwin

2

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

これを参照してください。 Arrays.asListは固定リストを返します。これは不変のものです。その定義によって、オブジェクトが作成されるとそのオブジェクトを変更することはできません。サポートされていない例外を投げている理由を教えてください。

+1

文字列も不変です。しかし、文字列を変更すると、新しいメモリ位置が割り当てられ、内部的に新しい文字列が作成されます。そのため、効果的に変更できない文字列を変更できます。だから私はここでは返されたリストが不変であるとは思わない。 Arrays.asList()は文字列[]を参照するだけです(文字列[]をコピーしてリストを作成しません)。 – Ashwin

+0

Arraysクラスの内部クラスAraayListを調べると、修正できないという事実を理解できます。単にそれはプライベート最終E [] aを使用します。あなたが戻ってくるリストを変更することができない理由です。文字列の場合、作成した文字列は変更できません。しかし、文字列クラスでは、APIは新しいオブジェクトを作成することで内部的に変更を処理する方法で開発されています。 –

+0

これは、文字列[]のコピーを作成し、最終として宣言しているということです。あなたはそれが文字列[]を参照せず、それ自身のコピーを保存していると言っていますか(しかし最終的に)? – Ashwin