2017-06-28 7 views
0

この形式のファイルからこのプログラムをコンパイルすることはできません( "Via"は "for road" 「)私は学校でのプログラミングの練習をしていますが、 "java.util.ConcurrentModificationException"エラーを解決できません。

ヴィアエミリア - >経由ボッティ
経由カステッロ - >ヴィアエミリア
アッピア街道 - >経由ボッティ
経由ボッティ - >ヴィアエミリア
経由カステッロ - >経由アメンドラ
アッピア通り - >アンコーナ通り
カステッロ通り - >ボッティ通り
経由オッティ - >経由カルソ・
経由アンコーナ - >経由オッティ
経由カルソ - >経由オッティ

そして第三の質問には次のように(再帰的である道路別にものを見つけるために私を頼みます - > bとb - > a)、しかし、私は(aとbが再帰的で、bとaが再帰的であるように)重複した回答の可能性を取り除く条件をつけると、 "java.util.ConcurrentModificationException" 、 どういう意味ですか?

これは、これは3番目の質問

public static void punto3(ArrayList<percorso> perc) throws Exception{ 

    BufferedWriter bw=new BufferedWriter(new FileWriter("3.html")); 
    bw.write("<html> \n <body> \n"); 
    bw.write("<h1> Punto 3 </h1> \n"); 
    bw.write("<h3><i> Trovare le coppie di strade che formano un anello chiuso </h3></i> \n"); 
    ArrayList<percorso> perc2 = new ArrayList<percorso>(); 
    for (percorso k: perc) 
     perc2.add(k); 

    ArrayList<String[]> Arr = new ArrayList<String[]>(); 

    for (percorso i: perc2){ 
     for (percorso j: perc2){ 
      if (i.from.equals(j.to) && i.to.equals(j.from)){ 
       String [] e = {i.from,i.to}; 
       Arr.add(e); 
      } 
     } 
    } 

    ArrayList<String[]> Arr2 = new ArrayList<String[]>(); 
    for (String [] z: Arr){ 
     Arr2.add(z);} 

    for (String [] f: Arr){ 
     for (String [] j: Arr2){ 
      if (f[0].equals(j[1]) && j[0].equals(f[1])) 
       Arr.remove(j); 
     } 
    } 
    for (String [] x: Arr) 
    bw.write("le vie "+x[0]+", "+x[1]+" formano un anello chiuso <br>"); 
    bw.write("</body> \n </html> \n"); 
    bw.close(); 
    } 

とクラスpercorsoで答えをコンパイルする方法であり、メイン

public static void main(String[] args) throws Exception{ 

    ArrayList<percorso> perc = new ArrayList<percorso>(); 

    String line; 
    BufferedReader br = new BufferedReader(new FileReader("vie.txt")); 

    while ((line = br.readLine())!=null){ 
    percorso p = new percorso (null,null); 
    String [] e = line.split("-->"); 
    p.from = e[0]; 
    p.to = e[1]; 
    perc.add(p); 
    } 
    br.close(); 
    //punto1(perc); 
    //punto2(perc); 
    punto3(perc); 
}  

あなたは、次の

public class percorso { 
    String from; 
    String to; 

    public percorso (String from,String to){ 
    this.from = from; 
    this.to = to; 
    } 
    } 
+0

スタックトレースを追加することができますか、その例外をどのラインで得ることができますか? –

+1

この問題については、SOのドキュメント項目があります。チェックアウト:https://stackoverflow.com/documentation/java/90/collections/2197/removing-items-from-a-list-within-a-loop#t=201706281424260548454 – GPI

+4

'Arr.remove(j);' < - あなたがそれを反復している間、 'Arr'の内容を変更しています。あなたはそれを行うことができますが、 'for'またはenhanced' for'ループではなく、 'Iterator'リファレンスを使用する必要があります。 – JonK

答えて

0

されていますあなたがそれをループしている間、arraylistからレコードを削除しようとしています:Arr.remove(j)。 これにより、ConcurrentModificationExceptionが発生します。

ループ中にarraylistから削除する代わりに、別のリスト(valuesToRemoveなど)に追加できます。これにより、削除するすべてのレコードが保持され、ループの後にArr.removeAll(valuesToRemove)が呼び出されます。

0

したがって、Arr.remove(j)を使用しているという問題があります。 forループの中で、あなたはそれを行うことはできません。

あなたはこれを読むことができます。 How to avoid "ConcurrentModificationException" while removing elements from `ArrayList` while iterating it?

そしてこの Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

をしかし、基本的に、あなたは例えば、次のように、要素を削除するには、イテレータを使用している何をすべきか:

Iterator<String> iter = myArrayList.iterator(); 

while (iter.hasNext()) { 
String str = iter.next(); 

if (someCondition) 
    iter.remove(); 
関連する問題