2016-10-20 6 views
0

Iコード下記たそれを修正しないaltough、リストを反復処理(UPDATE:私は追加フルコード)ConcurrentModificationExceptionが一方

public class Triangle { 
    private Vertex2D a; 
    private Vertex2D b; 
    private Vertex2D c; 

private boolean divided = false; 

public static ArrayList<Triangle> triangles = new ArrayList<>(); 
public static ArrayList<Triangle> newTriangles = new ArrayList<>(); 

public Triangle(Vertex2D a, Vertex2D b, Vertex2D c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    triangles.add(this); 
} 

public Triangle(Vertex2D a, Vertex2D b, Vertex2D c, int depth) { 
    this(a,b,c); 
    if (depth > 0) { 
     divide(depth); 
    } 
} 

public Vertex2D getVertexA() { 
    return a; 
} 

public Vertex2D getVertexB() { 
    return b; 
} 

public Vertex2D getVertexC() { 
    return c; 
} 

public boolean isDivided() { 
    return divided; 
} 

public Triangle getSubTriangle(int i) { 
    if ((!isDivided()) || (i > (triangles.size() - 1))) { 
     return null; 
    } 
    return triangles.get(i); 
} 

public boolean divide() { 
     if (isDivided()) { 
      return false; 
     } 
     Vertex2D ac = new Vertex2D((getVertexA().getX() + getVertexC().getX())/2, (getVertexA().getY() + getVertexC().getY())/2); 
     Vertex2D bc = new Vertex2D((getVertexB().getX() + getVertexC().getX())/2, (getVertexB().getY() + getVertexC().getY())/2); 
     Vertex2D ab = new Vertex2D((getVertexA().getX() + getVertexB().getX())/2, (getVertexA().getY() + getVertexB().getY())/2); 

     Triangle t1 = new Triangle(a, ab, ac); 
     Triangle t2 = new Triangle(ab, b, bc); 
     Triangle t3 = new Triangle(ac, bc, c); 

     newTriangles.add(t1); 
     newTriangles.add(t2); 
     newTriangles.add(t3); 
     divided = true; 
    return true; 
} 
public boolean divide(int depth) { 
    if (depth == 0) return false; 
    while (depth > 0) { 
     newTriangles.clear(); 
     for (Iterator<Triangle> iterator = triangles.iterator(); iterator.hasNext();) { 
      Triangle t = iterator.next(); 
      t.divide(); 
     } 
     triangles.addAll(newTriangles); 
     divide(depth-1); 
     return true; 
    } 
    return true; 
} 

}

Vertex2D:

public class Vertex2D { 

private double x; 
private double y; 

public Vertex2D(double x, double y) { 
    this.x = x; 
    this.y = y; 
} 

public double getX() { 
    return x; 
} 

public double getY() { 
    return y; 
} 

public double distance(Vertex2D v) { 
    if (v == null) return -1.0; 
    return Math.sqrt(Math.pow(this.x - v.getX(),2.0) + Math.pow(this.y - v.getY(),2.0)); 
} 

public String toString() { 
    return "[" + x + ", " + y + "]"; 
} 

}

メソッド呼び出し

public static void main(String[] args) { 
    Vertex2D a = new Vertex2D(-100,0); 
    Vertex2D b = new Vertex2D(0,100); 
    Vertex2D c = new Vertex2D(100,-100); 
    try { 
     Triangle triangle = new Triangle(a, b, c, 3); 
    } catch (ConcurrentModificationException e) { 
     e.printStackTrace(); 
    } 
} 

私はそれを実行するたびにConcurrentModificationExceptionを取得します。今、この問題は何度もここで議論されていますが、この例外をスローする理由は、繰り返しながらリストに要素を追加/削除することにありました。私の再帰的なメソッドでは、空の一時リストを作成し、繰り返しを通して、繰り返しの終わりまで反復リストをそのままにして、一時リストに新しい要素を追加するだけです。しかし、私はまだ例外を取得します。どうしてこれなの?

+0

スタックトレースしてください。 – EJP

+0

フルコードをお願いします –

+0

Vertex2Dのソースがまだありません – darioo

答えて

2

のイテレータを使用すべきであることが判明:

for (Iterator<Triangle> iterator = triangles.iterator(); iterator.hasNext();) { 
     Triangle t = iterator.next(); 
     t.divide(); //in divide you add new triangle to triangles 
    } 

あなたはconstrucorでtianglesを変更メソッド内分割():

divide() { 
    //.... 
    Triangle t1 = new Triangle(a, ab, ac); 
    //... 
} 


public Triangle(Vertex2D a, Vertex2D b, Vertex2D c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    triangles.add(this); //this is the place where you modify triangles 
} 
-1

私は先日、やや似たような経験を持っていた、私は三角形を反復しながらあなたの代わりにforeachの

for (Iterator<Triangle> iterator = triangles.iterator(); iterator.hasNext();) { 
    Triangle t = iterator.nect(); 
    t.divide(); 
} 
+0

まだ同じです。 –

+0

イテレータを追加または削除する場合は、イテレータを使用する必要があります。 – EJP

+0

これはエラーが発生してからのことだったようですが、謝罪しましたが、その時点で完全なコードはありませんでした見る –

関連する問題