Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从ArrayList中正确删除对象?_Java_Object_Arraylist - Fatal编程技术网

Java 如何从ArrayList中正确删除对象?

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

我正在尝试从ArrayList中删除一个对象。每个项目对象有3个属性;1.itemNum 2。信息3。成本。我还有3个班,1。Item类定义存储在目录中的单个项。2.Catalog类维护项目对象的列表。3客户端类w/main方法。 我在Item类中有集合和get,在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/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方法中对象的相等性

然后使用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;
}
使用


确保您已在对象类中重写了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
  }
}
}