方法next()Java中的NoSuchElementException

Tru*_*yen 1 java nosuchelementexception

该方法的目的removeDuplicate(ArrayList<Card> l)是根据card_value类中的属性删除重复的对象Card,然后将它们添加到ArrayList并返回arr.

但我的程序返回错误:NoSuchElementException在行

dum.add((Card) it.next());

我不知道这里发生了什么,因为我打印出next()方法返回的对象,它完美打印出来.

有人请告诉我为什么我在下面的实现中出错:

private ArrayList<Card> removeDuplicate(ArrayList<Card> l){
    int end = l.size();
    Set<Card> set = new HashSet<>();

    for(int i = 0; i < end; i++){
        set.add(l.get(i));
    }
    ArrayList<Card> dummy = new ArrayList<>();
    Iterator it = set.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
        dummy.add((Card) it.next());
    }

    return dummy;
}
Run Code Online (Sandbox Code Playgroud)

这些是覆盖方法:

@Override
    public int hashCode() {
        int hash = 5;
        hash = 97 * hash + this.card_value;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this){
            return true;
        }
        if (!(obj instanceof Card)){
            return false;
        }
        Card other = (Card) obj;
        return (this.card_value == other.card_value);
    }
Run Code Online (Sandbox Code Playgroud)

Ada*_*old 5

你打了.next()两次电话.next()获取迭代器中的下一个元素,但只hasNext()在第一个元素之前检查.

更改

while(it.hasNext()){
    System.out.println(it.next());
    dummy.add((Card) it.next());
}
Run Code Online (Sandbox Code Playgroud)

while(it.hasNext()){
    Card nextCard = (Card) it.next();
    System.out.println(nextCard);
    dummy.add(nextCard);
}
Run Code Online (Sandbox Code Playgroud)