Iterator重复数据删除

时间:2014-05-14 23:45:58

标签: java iterator duplicate-removal

实现迭代器(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();
    }
}

1 个答案:

答案 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}}

这应该足以让您自己获得正确的解决方案。祝你好运。