2012-02-01 45 views
0

我想添加和從一個對象的集合在相同的循環但在不同的方法中刪除,我的問題是添加和刪除後,我嘗試打印我的數組列表,但我不能得到最近添加的值。我使用ListIterator添加和刪除Iterator,因爲我在一堆網站閱讀,這是唯一的方法來添加和刪除,並且更改將直接發生在arraylist中,但我的問題是,它是添加和刪除並且調試器上的ArrayList計數或參考編號看起來很好,但是當我搜索它時,我無法找到新的。添加對象,我仍然可以找到已刪除的對象。 這是刪除和添加方法Java ArrayList創建,編輯和刪除

public void RemoveFromAnimalList(Animal A) { 
    Iterator<Animal> i = AnimalList.iterator(); 
    while (i.hasNext()) { 
     if (A == i.next()) { 
      i.remove(); 
     } 
    } 
} 

public boolean AddNewAnimalList(Animal A) { 
    ListIterator litr = AnimalList.listIterator(); 
    Animal B = null; 
    while (litr.hasNext()) { 
     B = (Animal) litr.next(); 

      litr.add(A); 
      return true; 

    } 
    return false; 
} 

這是調用上面這些方法的方法和我已經試過各種調試一切,每次我找不到eventhough ArrayList中數新增加元素的外觀看起來不錯,我有400對象,當我刪除它達到399,然後再次當我添加它回到400,但是當我嘗試打印並通過對象我不能找到新的。

public void FirstBirth() { 
    TheXYAxisControl XYSave = null; 
    int X = 0; 
    int Y = 0; 
    for (Animal A : AnimalList) { 
     if (A.Type.equals("Empty")) { 

      X = A.XAxis; 
      Y = A.YAxis; 
      XYSave = new TheXYAxisControl(X, Y); 
      TheXYaxisArrayList.add(XYSave); 

     } 
    } 
    Random RandomNumberGen = new Random(); 

    for (int s = 0; s < 3; s++) { 

     int RandomNumberGenerator = RandomNumberGen.nextInt(TheXYaxisArrayList.size()); 

     Animal NewAnimal = new Animal(0, "Male", 0, TheXYaxisArrayList.get(RandomNumberGenerator).getX(), TheXYaxisArrayList.get(RandomNumberGenerator).getY(), 0); 
     RemoveFromAnimalList(AnimalList.get(RandomNumberGenerator)); 
     AddNewAnimalList(NewAnimal); 
     RemoveFromOtherList(TheXYaxisArrayList.get(RandomNumberGenerator)); 
    } 

    int RandomNumberGenerator = RandomNumberGen.nextInt(TheXYaxisArrayList.size()); 
    Animal NewAnimal = new Animal(0, "Female", 0, TheXYaxisArrayList.get(RandomNumberGenerator).getX(), TheXYaxisArrayList.get(RandomNumberGenerator).getY(), 0); 
    RemoveFromAnimalList(AnimalList.get(RandomNumberGenerator)); 
    AddNewAnimalList(NewAnimal); 
    RemoveFromOtherList(TheXYaxisArrayList.get(RandomNumberGenerator)); 

} 

如果您有任何問題或其他部分代碼,我可以解釋。

+1

作爲供參考您的方法和變量名稱應該以小寫字母開頭,它有助於區分它們與對象。 – 2012-02-01 14:21:28

+0

爲什麼不使用arraylist的remove方法呢? – thatidiotguy 2012-02-01 14:17:52

回答

1

你應該真的在你的集合,列表,迭代器,ListIterator等中使用Java泛型,並避免強制轉換。

if (A == i.next()) 

這只是比較2個引用:

而且你與==跡象比較這裏。修改成:

if (A.equals(i.next())) 
+0

我該如何避免投射,以及避免投射是什麼意思?即使我避免投射,我的對象將以我的方式直接添加到列表中? – 2012-02-01 14:26:39

+0

和代碼中的鑄造部件是無效的,因爲我不使用它。我需要修改它,但它不會影響 – 2012-02-01 14:29:02

+1

如果你聲明你的列表是這樣的:'List animalList = new ArrayList ();'你**不需要**'B =(Animal)litr .next();',而你可以使用'Animal B = litr.next();' – anubhava 2012-02-01 14:31:58

0

首先是一些有關使用Java代碼的外觀建議

  • 的方法應與小寫字母
  • 變量應小寫字母

的問題做起可能是你沒有比較對象的平等,而只是他們是同一個對象。

運算符==,用於對象類型比較實例。換句話說,這比較了對象分配給的內存的引用。

如果我們婉來比較它們具有相同內容的對象,我們應該使用的方法equals(Object object)

所以更換if (A == i.next())if (A.equals(i.next()))

另外一個好的做法是將一個常數與值進行比較,因此代替A.Type.equals("Empty")應該是"Empty".equals(A.Type)。這種做法可能會減少代碼中不需要的NullPointerExceptions。