如何从 ArrayList 中正确删除对象?
Posted
技术标签:
【中文标题】如何从 ArrayList 中正确删除对象?【英文标题】:How can I correctly remove an Object from ArrayList? 【发布时间】:2013-10-13 18:45:32 【问题描述】:我正在尝试从 ArrayList 中删除一个对象。每个 Item 对象有 3 个属性; 1. itemNum 2. 信息 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 的设置/获取。我也有成本和信息的设置/获取,但选择不包括对空间的操作
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
它编译得很好,但不会根据找到的索引删除。任何帮助都会很棒。
【问题讨论】:
您的目录中包含的项目的 id 是什么,您输入了哪些 id 来删除 我认为你应该为你的类实现一个带有 3 个参数的构造函数,而不是重载的。 此外,您的对象不是不可变的。这不是很好的风格。 【参考方案1】:在您的 Item
类中覆盖 equals
方法。您可以使用 itemNum
在您的 equals 方法中检查对象的相等性。
然后使用ArrayListremove(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;
【讨论】:
这是最好的方法。但是使用索引呢? 我的equals方法是this: public boolean equals(CatalogItem obj) //start equals if ((itemNum == obj.itemNum) && (info== obj.info) && (cost == obj .cost)) 返回真;否则返回假; //结束等于 @user2460398 如果仅使用 itemNum 唯一标识项目是合乎逻辑的,则从条件中删除其他比较。如果您不能仅使用 itemNum 来识别项目,那么仅使用 itemNum 作为输入来删除对象是不合逻辑的。 嗯,有道理。我将equals方法()设置为仅匹配itemNum,它仍然没有删除对象。 @user2460398 您的 equals 方法签名和实现不正确。始终使用覆盖注释来确保您正在覆盖该方法。我在 EDIT 部分的答案中添加了正确的 equals 方法。【参考方案2】:要从列表中删除对象,您需要先找出对象。您可以实现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
。
【讨论】:
【参考方案3】:使用ArrayList.remove()
确保在您的对象类中覆盖了 equals。
【讨论】:
以上是关于如何从 ArrayList 中正确删除对象?的主要内容,如果未能解决你的问题,请参考以下文章