簡體   English   中英

如何從ArrayList中正確刪除Object?

[英]How can I correctly remove an Object from ArrayList?

我正在嘗試從ArrayList中刪除一個對象。 每個Item對象都有3個屬性; 1. itemNum 2. info 3.成本。 我還有3個類,1。Item類定義存儲在目錄中的單個項。 2. Catalog類維護Item對象的列表。 3客戶端類w / main方法。 我有集合並獲取Item類,我在Catalog中有ArrayList。 在客戶端中,我提示“輸入要刪除的itemNum。 如何根據搜索itemNum從ArrayList中正確刪除Item對象? 下面是我的代碼以及到目前為止我嘗試過的內容。

 Public class Item 
 {
 private int itemNum;
  private String info;
  private double cost;
  private int itemNum;


   public Item()
  {   //start constructor
     itemNum = 0;   //default values
     info = "x";
     cost = 0;
  }   //end constructor


 public CatalogItem(int newItemNum, String newInfo, double newCost)
  {   //start overload constructor
     this.itemNum = newItemNum;
     this.info = newInfo;
     this.cost = newCost;
  }   //end overload constructor

//下面是itemNum的set / gets。 我也有成本和信息的設置/獲取,但選擇不包括做空間

  public int getItemNum()
  {   //start itemNum accessor
     return itemNum;

  }   //end getItemNum

  public void setItemNum(int newItemNum)
  {   //start itemNum mutator
     this.itemNum = newItemNum;
  }   //end setItemNum
  }   //end Item class

  public boolean equals(CatalogItem obj)
  {   //start equals
     if (itemId == obj.itemId)
        return true;
     else
        return false;
  }   //end equals

//下面是我的目錄類

 import java.util.*;

  public class Catalog
 {   //start class
  private ArrayList<CatalogItem> listOfObjects = new ArrayList<CatalogItem>(100);   //creates ArrayList
  Item newItem = new Item(newItemNum, newInfo, newCost);   

  public void remove(int id)
  {   //start remove
     int item = id;

     for (int index = 0; index < listOfObjects.size();        index++)
        if (newItem.getItemId() == item)   //if item in the inventory matches the item number passed  
        listOfObjects.remove(index);  //removes based on index, I’ve also tried listOfObjects.remove(item);

   /*   I’ve also tried an enhanced for loop
     for (CatalogItem obj : listOfObjects)
        if (newItem.getItemId() == item)
           listOfObjects.remove(newItem);         */


  }   //end remove

}

//下面是主要的。 它接收用戶關於itemNum,info和cost的輸入

 import java.util.*;   //allows use of Scanner class

   public class Client
  {   //start client class

  public static void main(String[] args)
  {   //start main
     Catalog serv = new Catalog();   //creates instance of Catalog class
     Scanner scan = new Scanner(System.in);   //creates instance of Scanner class called scan
              System.out.print("\nEnter in the Item ID you want to remove: ");  
              id = scan.nextInt();
              serv.remove(id);   //sends id to Catalog Class to be removed
 }   //end main
 }   //end class

它編譯得很好,但不會根據找到的索引刪除。 任何幫助都會很棒。

覆蓋Item類中的equals方法。 您可以使用itemNum檢查equals方法中對象的相等性。

然后使用ArrayList remove(Object o)方法刪除對象。 remove方法在內部使用equals來查找要刪除的對象。

編輯:

你沒有正確地覆蓋equals方法,這是正確的簽名和實現:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Item other = (Item) obj;
    if (itemNum != other.itemNum)
        return false;
    return true;
}

使用ArrayList.remove()

確保在對象類中重寫了等號

要從列表中刪除對象,您需要先找到對象。 您可以實現Comparable接口並覆蓋compareTo()方法以找出對象。

Public class CatalogItem implements Comparable
{
 private int itemNum;
 private String info;
 private double cost;
 private int itemNum;


public Item()
{   //start constructor
 itemNum = 0;   //default values
 info = "x";
 cost = 0;
}   //end constructor


public CatalogItem(int newItemNum, String newInfo, double newCost)
{   //start overload constructor
 this.itemNum = newItemNum;
 this.info = newInfo;
 this.cost = newCost;
}   //end overload constructor

public int compareTo(catalogItem c){
  if(c.getItemNum == this.getItemNum()){
     return 0;// zero means both are equal
  }
}
}

當您獲得itemNum表單輸入時,創建一個CatalogItem對象並設置此值並遍歷列表以檢查相等性。 如果您找到它然后從列表中刪除,但請確保您沒有從同一列表中刪除,否則您可以獲得Concurrency Exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM