2017-12-20 7 views
1

アムを使用するが、私はエラーを取得する配列リストとJavaで配列リストからelmentを削除しようとするIterator

"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(); 
     } 
    } 

ありがとうございます。

答えて

1

bは、Bookではなく、Iteratorです。現在Bookを取得するにはb.next()に電話する必要があります。また、現在の要素をBookにキャストする必要がないように、パラメータ化された型(Iterator<Book>)を使用する必要があります。 、代わりに直接ISBNプロパティにアクセスするの

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(); 
    } 
} 

もう一つの提案は、ゲッターを使用する - getISBN()

0

以下のように、b.next()をブックタイプのオブジェクトにキャストして比較します。あなたはループがない非常に明確である一方、タイプAの内部

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

あなたのコードを予約する型キャストイテレータ型にしようとしているため、実際にこれが起こっている、あなたのオブジェクトに簡単にキャスト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")

関連する問題