2010-11-21 11 views
0

こんにちは 私はこのコードを書いていますが、出力で.remove()メソッドが動作しなくなることがあります。 abcdは、xyのメンバーを持つPointsオブジェクトです。arrayListのremoveメソッドが機能しない

ここにはa and b and c and dの値がありますが、if文ではupperに対して削除する必要がありますが、そうではありません。

X :59 Y: 143 
X :165 Y: 140 
X :59 Y: 143 
X :165 Y: 140 


    System.out.println(upper.toString()); 
     for(int i =0;i<upper.size();i++) 

      if(upper.get(i)==a||upper.get(i)==b||upper.get(i)==c||upper.get(i)==d){ 
       upper.remove(i); 

      } 
     for(int i =0;i<lower.size();i++) 

      if(lower.get(i)==a||lower.get(i)==b||lower.get(i)==c||lower.get(i)==d){ 
       upper.remove(i); 
      } 



     System.out.println(upper.toString()); 
     System.out.println(lower.toString()); 


    first println : [X :108 Y: 89, X :165 Y: 140] 

    second println: [X :108 Y: 89, X :165 Y: 140] 

    third println : [X :105 Y: 191] 
+0

あなたがしたいことを簡単に/より良い方法で行う必要があります –

+0

私は自分の質問を編集しました。 – user472221

+0

うわー。私はちょうど言うことができます。ブレース。具体的には、カールしたもの。本当に。あるいは、メンテナンスプログラマーがこのコードを見て移動することを積極的に望んでいますか? ;-) –

答えて

7

私は右のあなたの質問を読んでいる場合は、== 2つのオブジェクトのプロパティを比較することを想定しています。それは、equalsのことです。 ==同じオブジェクトインスタンスに、ではないと同等のものにしている 2つの参照するかどうかを示します。例えばので

public class Foo { 
    public Foo(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @override 
    public boolean equals(Object other) { 
     Foo otherFoo; 

     if (other == null || !(other instanceof Foo)) { // or you might be more restrictive 
      return false; 
     } 

     otherFoo = (Foo)other); 
     return otherFoo.x == this.x && otherFoo.y == this.y; 
    } 

    @override 
    public int hashCode() { 
     // ...appropriate implementation of hashCode... 
    } 
} 

Foo a = new Foo(0, 0); 
Foo b = new Foo(0, 0); 
System.out.println(a == b);  // "false" 
System.out.println(a.equals(b)); // "true" 

別に:あなたが削除する必要がArrayListで2つのconsequtive一致するオブジェクトを持っているときに何が起こるかを考えてみましょう。彼らがリストのインデックス8と9にいるとします。ときi == 8だから、あなたはインデックス8にある項目を削除し、9になるように使用されるものでは8になりました。しかし、その後、forループ内でiをインクリメントし、インデックス9で新しいアイテムを続け、2番目のものは変更しません。ループしている間にリストを変更したい場合は、それを避けるためにループバックするか、Iteratorを使用してください。ここ

4

2つの問題。まず、繰り返しながらオブジェクトをリストから削除します。それは良い考えではありません。

第2に、@T.J. Crowderのように、Javaで==演算子を誤解していると思います。

これは(あなたがequals問題を修正した後に)あなたが何をしようとして行うための良い方法です:

List<Point> mypoints = new ArrayList(); 
mypoints.add(a); 
mypoints.add(b); 
mypoints.add(c); 
mypoints.add(d); 

List<Point> otherPoints = new ArrayList(); 

for(Point p: upper) 
    for(Point myPoint: mypoints) 
    { 
     if(p.equals(myPoint)) 
      break; 

     otherPoints.add(p); 
    } 

upper = otherPoints; 

upperSetある場合にのみ機能します別の実装(それとして重複を)キャッチしません。

List<Point> mypoints = new ArrayList(); 
mypoints.add(a); 
mypoints.add(b); 
mypoints.add(c); 
mypoints.add(d); 

for(Point myPoint: mypoints) 
{ 
    upper.remove(myPoint); 
} 
+0

私はそれが動作しませんでした! – user472221

+0

@ user472221:[equals() 'メソッドを' Point'クラスに追加しましたか?[@ T.J。クラウダーの答え](http://stackoverflow.com/questions/4238187/remove-method-for-arraylist-doesnt-work/4238221#4238221)? – Eric

+0

はい私はそれを追加しました – user472221

0

エリックが示すように、リストの長さは、アイテムがそこから削除されるように変化し、これだけ削除された要素の後の値のすべてのインデックスを行います。

私は「下」の意味が何であるかわかりません。私は、 "lower"を反復するループが "upper"から要素を削除しようとしていることに気付きました。これは意図的ですか?

これは「上」から削除する必要がポイントの「削除」リストに基づいて、私の解決策です。それぞれの==チェックをequals()チェックに置き換える以外は、元のテストのスタイルを使用することもできます。

Equals(...)実装がPointクラスから削除された場合、テストケースはオリジナルのa、b、c、d値のクローンを意図的に使用するため、 "upper"から削除されることはありません。

import java.util.ArrayList; 
import java.util.List; 

import junit.framework.Assert; 

import org.junit.Test; 


public class TestArrayList 
{ 
    @Test 
    public void testRemove() 
    { 
     // Test fixture: 
     Point a = new Point(115, 70); 
     Point b = new Point(139, 66); 
     Point c = new Point(195, 111); 
     Point d = new Point(144, 165); 

     List<Point> upper = new ArrayList<Point>(); 
     upper.add(a.clone()); 
     upper.add(b.clone()); 
     upper.add(c.clone()); 
     upper.add(d.clone()); 

     List<Point> remove = new ArrayList<Point>(); 
     remove.add(a.clone()); 
     remove.add(b.clone()); 
     remove.add(c.clone()); 
     remove.add(d.clone()); 

     // Assertions: 
     Assert.assertTrue(upper.size() == 4); 
     Assert.assertTrue(remove.size() == 4); 


     // Modified code: 
     System.out.println(upper.toString()); 
     System.out.println(remove.toString()); 

     for (Point p : remove) 
     { 
      upper.remove(p); 
     } 

     System.out.println(upper.toString()); 
     System.out.println(remove.toString()); 

     // Assertions: 
     Assert.assertTrue(upper.isEmpty()); 
     Assert.assertTrue(remove.size() == 4); 
    } 
} 

class Point implements Cloneable 
{ 
    public int x; 
    public int y; 

    public Point(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public Point clone() 
    { 
     return new Point(x, y); 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     if (this == o) 
     { 
      return true; 
     } 
     else if (o instanceof Point) 
     { 
      Point p = (Point) o; 

      return x == p.x && y == p.y; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    @Override public String toString() 
    { 
     return "X: " + x + " Y: " + y; 
    } 
} 
+0

D'oh!私はJava 1.4.2の 'ArrayList'ドキュメントを見ていました! – Eric

関連する問題