2013-10-07 3 views
4

Я пытаюсь удалить объект из ArrayList. Каждый объект Item имеет 3 атрибута; 1. itemNum 2. info 3. стоимость. У меня также есть 3 класса: 1. Класс предмета определяет отдельные элементы, хранящиеся в каталоге. 2. Класс Catalog поддерживает список объектов Item. 3 Класс клиента с основным методом. У меня есть наборы и попадает в класс Item, и у меня есть ArrayList в Каталоге. В клиенте у меня есть запрос «Ввести в itemNum для удаления. Как правильно удалить объект Item из ArrayList на основе поиска itemNum? Ниже мой код и то, что я пробовал до сих пор.Как правильно удалить объект из 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. У меня также есть наборы/получает за стоимости и информации, но решили не включать делать в космос

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

Что такое идентификаторы элементов, содержащихся в вашем каталоге, и какие идентификаторы вы вводили для удаления – gefei

+0

Я думаю, вам следует реализовать конструктор с тремя аргументами для вашего класса, а не с перегруженным. – UrsulRosu

+0

Кроме того, ваши объекты не являются неизменными. Это не очень хороший стиль. – sk2212

ответ

7

Переопределение equals метод в вашем классе Item. Вы можете использовать itemNum, чтобы проверить равенство объектов в методе equals.

Затем используйте ArrayList remove(Object o) метод удаления объекта. Метод remove использует equals внутренне, чтобы найти подлежащий удалению объект.

EDIT:

Вы не перекрывая метод 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

Мой равный метод istis: public boolean equals (CatalogItem obj) {// start равен if ((itemNum == obj.itemNum) && (info == obj.info) && (cost == obj.cost)) return true; else return false; } // end равно –

+0

@ user2460398, если логично однозначно идентифицировать элементы, используя только itemNum, тогда удалите другое сравнение из условий. Если вы не можете идентифицировать Элементы, используя jut itemNum, тогда не логично удалять объекты только с помощью itemNum, сделанного как вход. –

2

Использование ArrayList.remove()

Убедитесь, что вы переопределены равно в классе объектов.

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.

Смежные вопросы