【问题标题】:Iterating through a collection遍历集合
【发布时间】:2014-04-11 20:49:19
【问题描述】:

我正在尝试为 hasext() 创建迭代器的 next() 方法,以便集合的输出为:

"printing","elements","in","order","from","collection"

输入:

[A] - ["printing", "elements", "in"]

[B] - ["order"]

[C] - ["from", "collection"]

目前我的方法看起来像:

    public MyIterator(Collection<Collection<Object>> myColl) {
    _myColl = myColl;
}


public boolean hasNext() {

    if(myColl.next != null)
    {
        return true
    }

    return !queue.isEmpty();
}


    public Object next() throws java.util.NoSuchElementException {

    //Dont really know what to put in here....


}

任何指针将不胜感激

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

    最好的方法是声明一个计数器并在您访问 has next 时递增。逻辑上如果我要表达,那就是这样。

    private int counter = 0;
    
    public boolean hasNext(){
        counter = counter < collection.size()? counter + 1: counter;// increment
        return counter < collection.size();// check and give the appropriate boolean value
    }
    
    public T next(){
        return collection.get(counter);// to get the counter number of element
    }
    

    其中 counter 是类中的私有变量,T 是建立集合的对象类型的泛型类型。喜欢

    Collection<String>
    

    这个答案都是关于逻辑的。它可能包含也可能不包含确切的代码。

    【讨论】:

      【解决方案2】:

      好吧,我真的不明白你的问题..为什么你不能只使用普通的迭代器?

      我会告诉你如何创建一个基本的迭代器,让你了解基本的事情是如何工作的,然后调整你的解决方案:

      假设我们需要遍历一个 List 并且你想创建一个帮助类来完成它。

      class ListIterator<T>
      

      你需要两个私有字段

      • 要迭代的列表
      • 指向最后一项的指针

      和 3 个方法 + 1 个构造函数

      • hasNext() -> 布尔值,如果有更多要迭代的项目,则返回 true
      • next() -> 返回列表中的下一个元素
      • reset() -> 重置内部指针
      • 构造函数 -> 只需将列表作为参数进行迭代

      这些字段看起来如何?

      private final List<T> list; // The list where this call will iterate
      private int pointer; // The pointer to the next iterable item
      

      正如描述中所说,构造函数将引用列表,所以它只是

      public ListIterator(List<T> list)
      {
          this.list = list;
          pointer = 0;
      }
      

      保存引用并将指针设置为 0(开始)。

      我们来说说方法:

      hasNext 应该检查我们当前的指针是否已经达到列表的大小。 所以它只是(pointer != list.size())

      public boolean hasNext()
      {
          return (pointer != list.size());
      }
      

      如果有更多项目可用,则为 true,否则为 false。

      next 返回下一项(如果有)。可以通过使用我们的 hasNext 方法来简化,所以它将是

      public T next()
      {
          if (!hasNext())
              throw new NoSuchElementException("no field");
      
          return list.get(pointer++);
      }
      

      注意事项:

      • T 是返回值,因为我们的列表是 T 类型
      • list.get(pointer++) 我们首先从列表中的位置pointer 中获取项目,然后我们将指针加1

      重置方法只是一个pointer = 0

      public void reset()
      {
          pointer = 0;
      } 
      

      如何使用?

      像其他迭代器一样,创建一个 ListIterator 类型的新对象并将列表传递给迭代。

      List<String> test = new ArrayList<String>();
      test.add("Hello");
      test.add("World");
      test.add("Whatsapp");
      
      ListIterator<String> iterator = new ListIterator<String>(test);
      while (iterator.hasNext())
      {
          System.out.println(iterator.next());
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-23
        • 2011-01-30
        • 2015-04-04
        • 2016-01-07
        相关资源
        最近更新 更多