方法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;
}
这些是覆盖方法:
@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);
}
答案 0 :(得分:5)
您正在拨打.next()
两次。 next()
获取迭代器中的下一个元素,但只在第一个元素之前检查hasNext()
。
更改
while(it.hasNext()){
System.out.println(it.next());
dummy.add((Card) it.next());
}
到
while(it.hasNext()){
Card nextCard = (Card) it.next();
System.out.println(nextCard);
dummy.add(nextCard);
}
答案 1 :(得分:2)
Here您可以在java next()
中看到Iterator
方法的源代码。它看起来像这样:
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
如您所见,如果您不在数组中,则会引发NoSuchElementException
。因此,如果使用next()
仍然可以使用元素,则在每次调用之前调用hasNext()
两次而不进行检查将具有您描述的行为。
您的while()
应替换为:
while(it.hasNext()) {
dummy.add((Card) it.next());
}
但如果您真的想要打印出来,只需将其更改为:
while (it.hasNext()) {
Card card = (Card)it.next();
System.out.println(card);
dummy.add(card);
}
如果调用的方法可能很昂贵,那么当你需要在方法或循环中多次使用一个对象时,第二种方法是更好的方法。
答案 2 :(得分:1)
It.next()
返回下一个项目。
您在代码中执行的操作是两次调用it.next()
答案 3 :(得分:0)
因为next()每次都会在指针上移动,所以当你将它打印出来时,它会打印出最后一个,然后再尝试再次移动