2013-10-07 61 views
4

我想从ArrayList中移除一个对象。每个Item对象都有3个属性; 1. itemNum 2. info 3.成本。我也有3个类,1. Item类定义存储在目录中的单个项目。 2. Catalog类维护Item对象的列表。 3客户类别/主要方法。 我有集合,并在Item类中获取,并且我在Catalog中有ArrayList。在客户端,我有一个提示“输入itemNum删除。如何根据itemNum的搜索从ArrayList中正确删除一个Item对象?下面是我的代码和我迄今为止尝试过的。如何正确地从ArrayList中删除一个对象?

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,信息用户,成本

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 

它编译罚款,但不会删除基础上创建索引。任何帮助都会很棒。

+0

什么是包含在您的目录中的项目的ID,你输入了什么ID删除 – gefei

+0

我认为你应该实现一个构造函数3个参数为您的类,而不是重载之一。 – UrsulRosu

+0

此外你的对象不是不可变的。这不是很好的风格。 – sk2212

回答

7

覆盖equals方法在您的Item类中。您可以使用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; 
} 
+0

这是最好的方法。但是如何使用索引? – UrsulRosu

+0

我的等于方法isthis: public boolean equals(CatalogItem obj) {// start equals if((itemNum == obj.itemNum)&&(info == obj.info)&&(cost == obj.cost)) 返回true; else return false; } // end等于 –

+0

@ user2460398如果逻辑上唯一标识只使用itemNum的项目,则从条件中删除其他比较。如果使用突出itemNum无法识别项目,则仅使用itemNum作为输入删除对象是不合逻辑的。 –

0

要从列表中删除对象,您需要首先找到对象。您可以实现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

相关问题