2010-11-21 75 views
0

嗨 我已經寫了這個代碼,與輸出,你可以得到.remove()方法不起作用。 a,b,cd是一些Points對象有xy成員。刪除方法爲arrayList不起作用

這裏是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

必須有一個容易/更好的方式做你想做的事 – 2010-11-21 14:00:19

+0

我編輯了我的問題。 – user472221 2010-11-21 14:04:35

+0

哇。我可以說嗎?牙套。具體來說,捲曲的。真。或者你是否主動要求維護程序員在看到這些代碼時跳過? ;-) – 2010-11-21 14:07:10

回答

7

如果我正在閱讀你的問題,你假設==將比較兩個對象的屬性。它不,這就是equals==告訴你兩個引用是否與相同對象實例,而不是等價的。

因此,例如:

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處的新項目,而保持第二個項目不變。如果您想在循環播放列表時修改列表,請考慮向後循環以避免出現這種情況,或者使用Iterator

4

這裏有兩個問題。首先,您在迭代它時從列表中刪除對象。這不是一個好主意。其次,我認爲你誤解了Java中的==運算符,正如@T.J. Crowder所述。

這是做你正在嘗試做的(你已經解決了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 2010-11-21 14:31:16

+0

@ user472221:您是否按照[@ T.J。中所述將'equals()'方法添加到'Point'類中。克勞德的答案](http://stackoverflow.com/questions/4238187/remove-method-for-arraylist-doesnt-work/4238221#4238221)? – Eric 2010-11-21 15:18:43

+0

是的,我已經加入 – user472221 2010-11-22 07:21:42

0

正如埃裏剋意味着,名單變化項目的長度是從它刪除,並剛剛刪除的元素後,所以做的所有值的指數。

我不確定「下」的意義是什麼。我注意到遍歷「較低」的循環嘗試從「較高」移除元素。這是故意的嗎?

這是我的解決方案,它基於應從「上」移除的點的「刪除」列表。除了每個==檢查必須由equals()檢查代替外,還可以使用原始檢測的樣式。

如果將equals(...)實現從Point類中移除,則不會從「upper」中移除任何內容,因爲測試用例故意使用原始a,b,c和d值的克隆。

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 2010-11-21 15:20:23