Java 如何从ArrayList中正确删除对象?
我正在尝试从ArrayList中删除一个对象。每个项目对象有3个属性;1.itemNum 2。信息3。成本。我还有3个班,1。Item类定义存储在目录中的单个项。2.Catalog类维护项目对象的列表。3客户端类w/main方法。 我在Item类中有集合和get,在Catalog中有ArrayList。在客户端中,我有一个提示“输入要删除的itemNum。如何根据对itemNum的搜索从ArrayList中正确删除Item对象?下面是我的代码和我迄今为止尝试的内容Java 如何从ArrayList中正确删除对象?,java,object,arraylist,Java,Object,Arraylist,我正在尝试从ArrayList中删除一个对象。每个项目对象有3个属性;1.itemNum 2。信息3。成本。我还有3个班,1。Item类定义存储在目录中的单个项。2.Catalog类维护项目对象的列表。3客户端类w/main方法。 我在Item类中有集合和get,在Catalog中有ArrayList。在客户端中,我有一个提示“输入要删除的itemNum。如何根据对itemNum的搜索从ArrayList中正确删除Item对象?下面是我的代码和我迄今为止尝试的内容 Public class I
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/get。我也有成本和信息的set/get,但选择不包括do to space
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
它可以很好地编译,但不会基于找到的索引进行删除。任何帮助都会很好。在
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。要从列表中删除对象,您需要首先查找对象。您可以实现
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
对象,设置此值并遍历列表以检查是否相等。如果找到该值,则将其从列表中删除,但请确保您没有从同一列表中删除,否则您可以获得并发异常
项目的ID是什么我认为你应该为你的类实现一个具有3个参数的构造函数,而不是重载的。此外,你的对象不是不可变的。这不是很好的样式。这是最好的方式。但是使用索引呢?我的equals方法是:public boolean equals(CatalogItem obj){//start=if((itemNum==obj.itemNum)&&(info==obj.info)&&(cost==obj.cost))返回true;否则返回false;}//结束equals@user2460398如果仅使用itemNum唯一标识项是合乎逻辑的,则从条件中删除其他比较。如果无法使用jut itemNum标识项,则仅使用itemNum作为输入来删除对象是不合逻辑的。Hmmm,这是有意义的。我设置了equals方法()仅匹配itemNum,但它仍然没有删除对象。@user2460398您的equals方法签名和实现不正确。请始终使用override annotation来确保您正在重写该方法。我已在“编辑”部分的答案中添加了正确的equals方法。
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
}
}
}