gpt4 book ai didi

java - 去重迭代器

转载 作者:行者123 更新时间:2023-11-30 08:23:27 25 4
gpt4 key购买 nike

实现一个迭代器(通用),如果下一个元素等于最后打印的元素,它会跳过下一个元素。例如: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();
}
}

最佳答案

如果不实际为您编写代码,很难回答这个问题。

我将只关注这段代码的主要问题:

  • 它不适用于空集合,因为它在构造函数中无条件调用itr.next(),这会导致异常
  • 它不适用于单个元素集合,因为 hasNext() 返回 false 而不是 true - 这是因为你调用itr.next() 在构造函数中,然后在 hasNext() 中,您首先检查 itr.hasNext()
  • remove() 是完全错误的,因为之前调用了 itr.next()
  • 如果没有要返回的元素,它应该在 next() 中抛出 NoSuchElementException,但它没有

如何解决?

我将从构造函数中删除 itr.next() 开始,因为它会把很多事情搞砸。

然后你必须以某种方式区分两种情况:何时提前调用 itr.next() 。例如。添加一个 boolean 字段来促进这一点。

如果调用hasNext(),则必须提前调用itr.next()

您还应该准备好 itr.next() 返回 null 作为可以存储在集合中的完全有效的值。您不应依赖 next 不是 null。出于这个原因,您应该再使用一个 boolean 来确定您的 next 字段是否实际包含一个值或为空。

remove() 方法可能应该删除所有重复项,而不仅仅是一个元素。如果您发现实现起来要求太高,您可以随时抛出 UnsupportedOperationException。如果您决定实现它,请记住在 next() 尚未被调用或 remove() 已被调用时抛出 IllegalStateException在最后一次 next() 调用之后

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

关于java - 去重迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23667005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com