将给定数量的迭代器组合为一个迭代器的方法

时间:2019-05-28 14:05:03

标签: java generics iterator

我想创建一个方法,该方法将任意数量的可迭代对象(实现Iterator的对象,例如数组,ArrayList,HashMaps等)作为参数,并返回一个充当组合Iterator的新Iterator,对所有对象进行迭代所有给定Iterators的对象,使用每个对象的iterator()方法。这是一个通用方法,并且迭代器都属于同一类型

我已经尝试了5种不同的方法来实现这一目标。迄今为止,最成功的方法是附加的代码。它确实确实可以编译,但是问题几乎更多是供客户端使用。

@SuppressWarnings("unchecked")
    public static <T extends Iterator<T>> Iterator<T> iterateOver(Iterator<T>... iters) {
    int n = iters.length;
    int i = 0;
    Iterator<T> curr = iters[0];
    return new Iterator<T>() {
      @Override
      public boolean hasNext() {
        if (curr.hasNext()) {
          return true;
        } else if (i < n-1) {//if we have more iterators left
          curr = iters[++i];//set next iterator
          return hasNext();//recurr process
        }
        return false;//we have no more iterators lefts
      }

  @Override
  public T next() {
    return curr.next();
  }

  @Override
  public void remove() {
    curr.remove();
  }
};
}

从上述代码(位于Core.java中)的客户端使用(在Delaunay.java中):


  

Delaunay.java:48:错误:类Core中的方法iterateOver不能是   适用于给定的类型;       对于(Point [] poly:Core.iterateOver(lines,polys)){                               ^必选:Iterator []找到:ArrayList,ArrayList原因:无法推断   类型变量T       (varargs不匹配; ArrayList无法转换为Iterator),其中T是类型变量:       T扩展了在方法iterateOver(Iterator ...)中声明的Iterator


更多信息:点是仅容纳x,y坐标的对象。 'lines'和'polys'只是Point []类型的ArrayList,它表示一系列点,每个点都连接到上一个和下一个点(例如LinkedList)。这当然与实际问题无关,但是对于那些好奇的人来说,这只是一个简单的解释。看来ArrayList无法转换为Iterator。看到此消息后,我更改了客户端代码并访问了参数的iterator()方法(但是,这是尝试对其进行修复的简单方法,而不是可靠的修复方法)。当我这样做时,这是客户端(Delaunay.java)的新编译错误消息:


  

Delaunay.java:48:错误:类Core中的方法iterateOver不能是   适用于给定的类型;       for(Point [] poly:Core.iterateOver(lines.iterator(),polys.iterator())){                               ^必需:Iterator []找到:Iterator,Iterator原因:推断变量T具有   不相容边界       等式约束:Point []       上限:迭代器,其中T是类型变量:       T扩展了在方法iterateOver(Iterator ...)中声明的Iterator


在这一切之间,我真的很沮丧,感到迷茫。我不确定varargs是否使用不正确,或者我丢失了某些东西,但是我非常感谢您的帮助。 理想情况下,客户端只需要列出ArrayLists(或任何实现Iterable的东西),方法iterateOver()的工作方式将与我在上面的代码中描述的类似(因为它已经编译并且似乎可以理解我的想法) 。重要的部分是varargs,因为对于客户端来说,使用它非常方便,它可以简单地列出名称,而不必创建Iterator<T>类型的全新数组并进行转换等,那么客户端也可能没有组合迭代器,将我带到最后一点: 这样做的目的是当客户端要遍历单独列表中的所有项目并应用相同的代码,而又不想具有具有相同代码集的不同相同forfor循环,但又希望针对不同列表而不创建具有以下内容的单独函数时:他们将在所有列表项上运行的代码。 抱歉,长期阅读,我只想缩小搜索范围,以寻求帮助。

0 个答案:

没有答案