实现迭代器(Generic),如果它等于最后一个打印元素,则跳过下一个元素。 例如:AAABBCCCCD 在完成迭代时将打印ABCD。
以下是我的尝试。请建议是否可以更好地完成。
import java.util.Iterator;
public class DeDupIterator<E> implements Iterator<E> {
E next = null;
Iterator<E> itr;
public DeDupIterator(Iterator<E> iter) {
itr = iter;
next = itr.next();
}
@Override
public boolean hasNext() {
if(itr.hasNext())
if (next != null) {
return true;
}
return false;
}
@Override
public E next() {
E item=null;
while (itr.hasNext()) {
item = (E) itr.next();
if (!item.equals(next)) {
E temp = next;
next = item;
return temp;
}
}
next = item;
return next;
}
@Override
public void remove() {
itr.remove();
}
}
答案 0 :(得分:3)
如果没有真正为你编写代码,很难回答这个问题。
我将专注于此代码的主要问题:
itr.next()
,这会导致异常hasNext()
会返回false
而不是true
- 这是因为您在构造函数中调用itr.next()
然后在hasNext()
您首先检查itr.hasNext()
remove()
完全错误,因为之前调用了itr.next()
NoSuchElementException
中抛出next()
,但它不会如何解决?
我首先从构造函数中删除itr.next()
,因为它弄乱了很多东西。
然后你必须以某种方式区分两种情况:提前或不提前调用itr.next()
。例如。添加boolean
字段以促进这一点。
如果调用itr.next()
,您必须提前致电hasNext()
。
此外,您应该准备好itr.next()
返回null
作为可以存储在集合中的完全有效的值。您不应该依赖next
而不是null
。出于这个原因,您应该再增加一个boolean
,以确定您的next
字段实际上是保留值还是为空。
remove()
方法应该删除所有重复项,而不仅仅是一个元素。如果您发现要求太高,您可以随时抛出UnsupportedOperationException
。如果您决定实施该功能,请务必在IllegalStateException
尚未调用next()
时抛出remove()
,或在最后next()
次呼叫后调用{{1}}
这应该足以让您自己获得正确的解决方案。祝你好运。