数组列表和使用迭代器

问题描述 投票:1回答:3

我试图从Java中的Arraylist中删除一个元素,我收到一个错误

"Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$Itr cannot be cast to newpackage.Book";

这个错误的原因是什么,我该如何解决?

    public void removeBook(){
 int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
        Iterator b=books.iterator();
        while(b.hasNext()){
            if(i==((Book)b).ISBN)b.remove();
        }
    }

谢谢。

java arrays
3个回答
1
投票

b是一个Iterator,而不是Book。你应该打电话给b.next()来获得当前的Book。你应该使用参数化类型 - Iterator<Book> - 以避免将当前元素强制转换为Book

public void removeBook() {
    int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
    Iterator<Book> b=books.iterator();
    while(b.hasNext()) {
        if(i == b.next().ISBN)
            b.remove();
    }
}

另一个建议,而不是直接访问ISBN属性,使用getter - getISBN()


0
投票

将cast b.next()类型转换为Book类型对象,如下所示,然后进行比较。实际上这种情况正在发生,因为您试图将迭代器类型强制转换为预订类型

public void removeBook(){
int i=Integer.parseInt(JOptionPane.showInputDialog("Pleanse input isbn to be removed"));
        Iterator b=books.iterator();
        while(b.hasNext()){
            Book b1=(Book) b.next();
            if(i==(b1.ISBN)){
              b.remove();
            }
        }
    }

0
投票

while循环中的代码不是很清楚,只需将Iterator对象强制转换为对象并将其删除即可

   Iterator itr = books.iterator();
    int i=Integer.parseInt(JOptionPane.showInputDialog("Please input isbn to be removed"));

    Book Element = "";

    while (itr.hasNext()) {
      Element = (Book) itr.next();
      if (Element.id == i) {   
        itr.remove();
        break;
      }
    }

PS:您无法将Book对象与Integer'i'进行比较,如果'i'是要删除的书的id,则必须比较Book.id == i或String book name:Element.name .equals( “nameInput”)

© www.soinside.com 2019 - 2024. All rights reserved.