我有一个包含元素1到10的列表。 我尝试从中删除素数2,3,5,7,然后使用iterator打印列表的其余部分。但是这段代码抛出 NoSuchElementException 。 这是我的代码:
public static void editerate2(Collection<Integer> list3)
{
Iterator<Integer> it=list3.iterator();
while(it.hasNext())
{
if(it.next()==2 || it.next()==3 || it.next() ==5 || it.next()==7 )
{
it.remove();
}
}
System.out.println("List 3:");
System.out.println("After removing prime numbers : " + list3);
}
这样做的正确方法是什么? 还有什么区别使用“|”和“||” ???
答案 0 :(得分:6)
每次调用it.next()
时,迭代器都会前进到下一个元素。
这是不我想要做的事情。
你应该这样做:
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer thisInt = it.next();
if (thisInt == 2 || thisInt == 3 || thisInt == 5 || thisInt == 7) {
it.remove();
}
}
如果您使用||
且第一部分为真,则不会评估第二部分。
如果您使用|
,则始终会评估这两个部分。
这对于这样的情况很方便:
if (person == null || person.getName() == null) {
// do something
}
如果您使用|
且person为null,则上面的代码段会抛出NullPointerException。
那是因为它会评估条件的两个部分,而后半部分将取消引用一个空对象。
答案 1 :(得分:1)
您希望避免多次调用迭代器,因为它会将其推进到下一个元素。
可以做的是保留每次迭代获得的值,然后进行比较。
while(it.hasNext()) {
Integer next = it.next();
if(next == 2 || next == 3 || next == 5 || next == 7 ) {
it.remove();
}
}