[英]How can I remove a specific object from an arrayList and how can I check if it contains this 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;
}
確保在對象類中重寫了等號 。
要從列表中刪除對象,您需要先找到對象。 您可以實現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.