2017-06-23 8 views
-1

arrayListを繰り返し処理して、特定の条件に該当する項目を削除しています。コレクションからオブジェクトを削除するときにIllegalStateExceptionが発生する

public static ArrayList<String> filteredArrayList(HashMap<String, Boolean> filters){ 

    ArrayList<String> filteredArrayList = new ArrayList<>(); 
    filteredArrayList = fullList(); 

    Iterator<String> i = filteredArrayList.iterator(); 
    while (i.hasNext()) { 
     String s = i.next(); 

     if(!(filters.get("sometextStatus")) && (s.toLowerCase().trim().contains("sometext".trim().toLowerCase()))){ 
       i.remove(); 
     } 
     if(!(filters.get("120Status")) && (s.toLowerCase().trim().contains("120".trim().toLowerCase()))){ 
       i.remove(); 
     } 
    } 
} 

は、なぜ最初の文の仕事ん:

if(!(filters.get("sometextStatus")) && (s.toLowerCase().trim().contains("sometext".trim().toLowerCase()))){ 
    i.remove(); 
} 

しかし、もう一つは失敗しますか?

if(!(filters.get("120Status")) && (s.toLowerCase().trim().contains("120".trim().toLowerCase()))){ 
    i.remove(); 
} 

私が取得しています:スレッドで

例外 "メイン" java.lang.IllegalStateException

を1秒間。

+0

"s"と "i"は何ですか?私は理解するのに役立つだろう、例えば、タイプを知るために、あなたはおそらくループを表示することができます(無駄な線なし) – azro

+0

私はあなたが括弧を数えることから提供されたコードに何かがないと思う。 – PKlumpp

+5

あなたの質問投稿[mcve]に適切な答えを得るには。 – Pshemo

答えて

3
public static ArrayList<String> filteredArrayList(HashMap<String, Boolean> filters){ 

    ArrayList<String> filteredArrayList = fullList(); //Note, that fullList method already creates and returns array, so you don't need to create it before calling this method. 

    Iterator<String> i = filteredArrayList.iterator(); 
    while (i.hasNext()) { 
     String s = i.next(); 

     if(!(filters.get("sometextStatus")) && (s.toLowerCase().trim().contains("sometext".trim().toLowerCase()))){ 
       i.remove(); 
       continue; //We removed current element, so next if check might potentially removed already removed element! 
     } 

     if(!(filters.get("120Status")) && (s.toLowerCase().trim().contains("120".trim().toLowerCase()))){ 
       i.remove(); 
       continue; //Maybe a programmer will decide to copy-paste if checks, so it is safer to do so with continue. 
     } 
    } 
} 

更新

デバッグした後、私は

Exception in thread "main" java.lang.NullPointerException 
    at com.ca.training.jdk.loops.Main2.filteredArrayList(Main2.java:34) 
    at com.ca.training.jdk.loops.Main2.main(Main2.java:14) 

問題を発見できるという

filters.get("120Status") 

かの戻りNULL、あります!?。だから、追加ヌルチェック

Boolean status1 = filters.get("sometextStatus"); 
if((status1 != null && status1) && (s.toLowerCase().trim().contains("sometext".trim().toLowerCase()))) { 
    i.remove(); 
} 

キーワードcontinueプログラムは、新たなループパラメータでループを継続します。したがって、最初のifステートメントがtrueの場合、2番目のifチェックには行かず、次のi値でループ実行を続けます。

アドバイス

利用代わりに子クラスの基底クラスやインタフェースを、それが可能であるところはどこでも。

public static ArrayList<String> filteredArrayList(Map<String, Boolean> filters){ //Note, map 

    List<String> filteredArrayList = fullList(); //Note, list. 
+1

また、私たちは 'else if'を使うことができます –

+0

私は同意します。もしOPがそれらを別のコレクションに入れたいと思っていたら*どうしたらいいですか?そうでなければ、それを使うのが良いです。もう一度、私は同意します、この場合、** else if ** is fine! –

+0

まだエラーが発生しています。あなたはここに継続の機能が何であるか説明できますか?編集:気をつけて、それは継続して動作します。これはループや何かを繰り返すだけですか? – ConfidentKeyboard

0

最初のi.remove()は既に要素を削除したと思います。 2番目のチェックも一致すると、2番目のi.remove()はもう使用できなくなり、代わりに例外がスローされます。 i.remove()を呼び出したときはいつでもcontinue;を使用してください。

continueループの次の要素にジャンプします。

例外が発生した場所でコードの正確な行を投稿するのが簡単にわかります。

+0

コードの正確な行は次のとおりです。i.remove(); 2番目のif文で – ConfidentKeyboard

+0

これで、i.remove()の後に "continue"を呼び出すか、2番目のif文の代わりにelse ifを使用する必要があります。 –

0

Java8を多用していた場合は、これが役立つ可能性があります。

私たちはコンテンツを確認しているので、正確な一致ではありません。trim()アイテムはありません。

数値が一致する場合は、lowerCase()も必要ありません。アイテムを削除する

シンプルラムダ:

filteredArrayList.removeIf(s -> 
       s.contains("123") 
      || s.toLowerCase().contains("asd".toLowerCase()) 
      || s.toLowerCase().contains("something else".toLowerCase()) 
      || s.toLowerCase().contains("something else".toLowerCase()) 
     ); 

sは、あなたがそれをはい反復子のアイテムですwant-として、あなたがそれを呼び出すことができ、リスト内のアイテムです。

+0

ええと、これは複数回使用することができますか?言い換えれば、異なる文字列を含むアイテムを削除することができますか?また、この文脈では何がありますか?これにはまだイテレータが必要ですか? – ConfidentKeyboard

+0

はい私はラムダを展開します答えを編集します – LazerBanana

+0

ありがとう!どちらの方が良いですか?この方法に利点はありますか? – ConfidentKeyboard

関連する問題