【问题标题】:Can you create a Java Iterator over a 2d array?你能在二维数组上创建一个 Java 迭代器吗?
【发布时间】:2011-11-14 06:22:19
【问题描述】:

你能创建一个迭代器来遍历二维数组中的所有空间吗?

【问题讨论】:

  • @Brian - 这是一个很好的链接!
  • 是的 - 我看到有人在这里以这种方式使用它,我现在已经采用了它。我认为它解释了这个问题,而不是咆哮或过于苛刻。
  • 你会使用什么迭代顺序? X,Y,X1,Y1,X2,Y2 等...还是 X,X1,X2... Y,Y1,Y2 等...?
  • 这实际上是一个相当明智的问题,而且很难做到。我不希望没有经验的程序员能够做到这一点。

标签: java arrays iterator


【解决方案1】:

如果你实现了Iterable 接口,你可以使用for-each loop。相关示例可以在here 找到。

【讨论】:

    【解决方案2】:

    是的,将数组包装在一个对象中,并使该对象实现迭代器接口。所以可以做到。我不知道 Jdk 附带的任何此类迭代器。

    【讨论】:

      【解决方案3】:

      是的,可以做到,正如@Scorpion 所说。事实上,解决方案可能很简单:不超过 10 行可执行代码……如果我理解正确的话。

      不,JDK 中没有方便的方法来执行此操作。而且我不知道任何“公共”库中的一个。 (原因:这个特殊问题太专业了,对少数程序员有用。)

      这应该是您自己实施解决方案的充分答案。


      我/我们应该为您提供盆栽解决方案吗?国际海事组织,没有。

      • StackOverflow 不是“我们免费为您编写代码”的服务。

      • 如果您自己动手,您将了解更多信息:阅读出色的 "What have you tried?" 博客文章。

      (即使有人确实想为您编写代码,您也没有对问题给出足够清晰的描述来实现......没有进行大量猜测。)

      【讨论】:

        【解决方案4】:

        我认为从数组中调用这两个迭代器时不需要创建一个迭代器,就像示例一样:

        int 2dArray[][];
        for(int 1dArray[]: 2dArray){
            for(int i: 1dArray){
                //do stuff
            }
        }
        

        【讨论】:

          【解决方案5】:
          import java.util.LinkedList;
          import java.util.Queue;
          
          public class TwoDIterator {
          int[][] array;
          int outerCursor;
          int lastArrayLen;
          int totalElems;
          int tracker = 1;
          Queue<Integer> myQueue = new LinkedList<>();
          
          public TwoDIterator(int[][] arr) {
              this.array = arr;
              this.outerCursor = 0;
              for (int i = 0; i < arr.length; i++) {
                  for (int j = 0; j < arr[i].length; j++) {
                      totalElems += 1;
                  }
              }
              for (int i = 0; i < array[0].length; i++) {
                  myQueue.add(array[0][i]);
              }
          }
          
          public boolean hasNext() {
              return array.length > outerCursor && totalElems >= tracker;
          }
          
          public Integer next() {
              if (myQueue.isEmpty()) {
                  outerCursor++;
                  for (int i = 0; i < array[outerCursor].length; i++) {
                      myQueue.add(array[outerCursor][i]);
                  }
                  if (!myQueue.isEmpty()) {
                      tracker++;
                      return myQueue.remove();
                  }
              } else {
                  tracker++;
                  return myQueue.remove();
              }
              return -1;
          }
          
          public static void main(String[] args) {
              int[][] arr = { { 1, 2, 3 }, { 1, 3 }, { 1, 2, 5 } };
              TwoDIterator iter = new TwoDIterator(arr);
              while (iter.hasNext()) {
                  System.out.println(iter.next());
              }
          }
          }
          

          【讨论】:

          • 请详细说明您的问题。
          猜你喜欢
          • 2021-12-06
          • 2013-02-18
          • 2012-10-04
          • 2019-04-29
          • 2021-04-30
          • 2012-11-06
          • 1970-01-01
          • 2021-03-16
          • 2016-01-08
          相关资源
          最近更新 更多