【问题标题】:How can I correctly remove an Object from ArrayList?如何从 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 个参数的构造函数,而不是重载的。
  • 此外,您的对象不是不可变的。这不是很好的风格。

标签: java object arraylist


【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2019-02-13
      • 2021-04-28
      • 2021-03-11
      • 2015-08-02
      • 1970-01-01
      • 2019-08-22
      相关资源
      最近更新 更多