2012-04-23 18 views
4

ArrayListから長さが整数として渡された数に等しい要素を削除したいとします。私のコードは以下の通りです。実行すると、remove()メソッドが使用されたときに、プログラムはUnsupportedOperationExceptionを行にスローします。実際、それはコード・バットの問題です。ArrayListからオブジェクトを削除する

public static List<String> wordsWithoutList(String[] words, int len) {  
    List<String> list = new ArrayList<String>(); 

    list = Arrays.asList(words); 

    for(String str : list) { 
     if(str.length() == len) { 
      list.remove(str); 
     } 
    } 
    return l;  
} 
+0

[OK]を、そしてあなたの質問は何ですか? – simchona

+0

私は上記の例外を投げている理由を知りたいのですが、 –

+0

にキャストすべきです(リスト)Arrays.asList(words); – aviad

答えて

10

asListによって返されたリストはArrayListではありません - それは変更をサポートしていません。

  • ArrayListコンストラクタを使用してasListで返される配列の変更可能なコピーを作成します。

    あなたが

    public static List<String> wordsWithoutList(String[] words, int len) { 
    
        List<String> l = new ArrayList<String>(Arrays.asList(words)); 
    
        for(Iterator<String> iter = l.iterator(); iter.hasNext();){ 
         String str = iter.next(); 
         if(str.length()==len){ 
          iter.remove(); 
         } 
        } 
        return l;  
    } 
    

    だから、2つのことを行う必要があります。

  • ConcurrentModificationExceptionを避けるには、イテレータのremoveを使用します。

それは、これは非効率的であることができ、これよりよい選択肢があることが指摘された:

List<String> l = new ArrayList<String>(str.length()); 
            // ^^ initial capacity optional 
for(String str : words) 
    if(str.length()!=len) 
     l.add(str); 

return l; 
+1

Curious、isこれは良い練習です(あなたが反復しているリストを変更する)?必要な要素を追加して新しいArrayListを返すべき場所に新しいリストを作成する必要がありますか? – zengr

+2

新しいリストを作成してアイテムを追加する方がクリーンだと思います。 – SimonC

+0

@ zengrどちらの戦略でも、中からアイテムを削除する 'ArrayList'がリスト内の次のアイテムをすべて移動するので、削除するアイテムが多数ある場合やリストが大きい場合は、コピー戦略を使用する方が良いでしょう。 – trutheality

関連する問題