2017-09-29 25 views
0

私は、文脈自由文法で読み込み、すべての非終端記号のFirstSetsを返すJavaプログラムを書くという割り当てを持っています。私は、Java - 再帰的メソッドとネストされたイテレータのConcurrentModificationException

String s = it1.next(); 

ArrayList<String> nestedFS = firstSet(s); 

私の知る限り:しかし、私はラインのConcurrentModificationExceptionがエラーを取得しておく

public static ArrayList<String> firstSet(String nonTerminal){ 
    ArrayList<String> first = new ArrayList<String>(); 
    //Find initial elements of FirstSet 
    for(String[] current : prodRules) { 
     if (current[0].equals(nonTerminal)){ //if the production rule is for that non-terminal 
      if(current.length > 2) { 
       first.add(current[2]);   //first element after "-->" is added to FirstSet 
      } else 
       first.add("eps"); 
     } 
    } 
    //Add the FirstSet of each element in the initial FirstSet 
    ArrayList<String> copy = first; //to avoid ConcurrentModificationException 
    Iterator<String> it1 = copy.iterator(); 
    while(it1.hasNext()) { //recursively find each FirstSet of the initial elements 
     String s = it1.next(); 
     System.out.println("FIRST("+s+")={"); 
     ArrayList<String> nestedFS = firstSet(s); 
     Iterator<String> it2 = nestedFS.iterator(); 
     while(it2.hasNext()) { 
      String f = it2.next(); 
      if(!first.contains(f)) 
       first.add(f); 
      System.out.print(" "+f+" "); 
     } 
     System.out.print("}"); 
    } 
    return first; 
} 

:私は私のFirstSet()メソッドを再帰的なアプローチを取ってきました私が現在繰り返しているリストは変更しません。むしろ、私はコピーを繰り返しています。私は余分なメモリの使用やスピードには関心がありません、私は動作するためにこれを必要とします。

私がここで間違っていることについての手掛かりはありますか?どんな助けも大歓迎です。

答えて

0

最初にArrayListのコピーを作成するには、CopyOnWriteArrayListを使用して、ConcurrentModificationExceptionを回避します。

ArrayList<String> copy = first; //replace this line with 
    CopyOnWriteArrayList<String> copy= new CopyOnWriteArrayList<String>(first); 

ArrayListのではなく、我々は、スレッドセーフであるCopyOnWriteArrayListとを使用することができ、スレッドセーフとスレッドの安全性を実装する必要はありません。

+0

これが解決策でした。ありがとうございました。 – NeroTheHero

関連する問題