【问题标题】:Using an iterator for a set of type Object?对一组对象类型使用迭代器?
【发布时间】:2011-01-27 02:34:18
【问题描述】:

好的,所以我应该实现一个集合,其中包含 Object 类型的元素没有重复项,这意味着我需要将每个新元素与集合中的先前元素进行比较。该集合有自己的类,并有一个插入新元素的方法。

我的问题是:如何使用我在下面编写的迭代器将集合中的所有条目与建议添加的元素进行比较?

class SetIterator implements MyIterator {
    private ArraySet arr;  //ArraySet is the name of the Set class
    private int n;

    SetIterator(ArraySet myArraySet)
    {
        arr = myArraySet;
        n = 0;
    }

    @Override
    public boolean hasNext() 
    {
        return (n <= arr.size());
    }

    @Override
    public Object next()
    {
        if (hasNext())
            return arr[n++];
    }   
}

谢谢!

【问题讨论】:

  • 不清楚你在这里想要完成什么。这是作业吗?
  • 那里也有一堆错误 - hasNext 应该是 n
  • 是的,我只是想要一个关于如何使用该迭代器而不是 for 循环或 while 循环的示例。

标签: java iterator


【解决方案1】:

在 ArraySet.java 中你需要这样的东西。

public Iterator iterator()
{
    return new SetIterator(this);
}

public boolean add(Object o)
{
    for (Object item : this)
        if (o.equals(next)) return false;
    }
    // add code to put o in the array
    return true;
}

for 循环被编译器翻译成这样的:

Iterator it = this.iterator();
while (it.hasNext())
{
    Object item = it.next();
    if (o.equals(next)) return false;
}

【讨论】:

    【解决方案2】:

    Set 的实现应该保证不重复,而不是Iterator

    也就是说,您的 Set.add() 及其以 Collection 作为参数的构造函数应该保证不重复。 迭代器只实现了hasNext()next()remove()

    如果 Iterator 负责重复检查,您的 Set 将违反 java.util.Set 合同。此外,Iterator 将承担两项职责——检查重复和遍历,这违反了“单一职责原则”。

    【讨论】:

      【解决方案3】:

      是的,我只是想要一个关于如何使用该迭代器而不是 for 循环或 while 循环的示例。

      您几乎必须使用某种循环来使用Iterator。这是基本模式:

      Iterator it = ... // instantiate the iterator
      while (it.hasNext()) {
          Object obj = it.next();
          ... // do something with obj
      }
      

      如果集合对象(例如您的对象集)实现了Iterable,那么您可以使用新的for 循环语法;例如

      for (Object obj : yourSet) {
          ... // do something with obj
      }
      

      当然,还有其他表达方式,但它们涉及(某处)某种循环以从迭代器中提取对象。

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 2015-11-28
        • 2022-01-19
        • 2019-05-01
        • 2011-04-29
        • 2015-06-07
        • 1970-01-01
        • 2019-08-23
        相关资源
        最近更新 更多