【问题标题】:Use a for loop to iterate over a new Class in java使用 for 循环遍历 java 中的新类
【发布时间】:2014-12-17 01:25:31
【问题描述】:

我正在尝试将 for 循环与新类一起使用 我创建了一个简单的 java 程序,它将从一个数字一直打印到 另一个。我似乎无法掌握 for 循环的窍门 这是我为测试它而编写的示例代码:

import java.util.Iterator;
public class Try {
   public static void main(String[] args) {
      for (int i : new IntegerLoop(1, 9)) {
        System.out.print(i + " ");
      }

      System.out.println();

      for (int i : new IntegerLoop(-3, 3)) {
        System.out.print(i + " ");
      }

      System.out.println();

   }
}

这是一个 IntergerLoop 类,它只处理要打印的第一个和最后一个数字 导入 java.util.Iterator;

public class IntegerLoop implements Iterable<Integer>, Iterator<Integer> {
    int first, last;
    int nextInt;

    public IntegerLoop(int f, int l) {
        first = f;
        last = l;
        nextInt = first;
    }

    public boolean hasNext() {
        return nextInt >= first && nextInt <= last;
    }

    public Integer next() {
        if (hasNext()) {
            int result = nextInt; // needs Iterator
            nextInt++;
            return result;
        }
        return null;
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub

    }

    @Override
    public Iterator<Integer> iterator() {
        // TODO Auto-generated method stub
        return null;
    }
}

【问题讨论】:

  • 有什么问题?
  • Iterables 真的不应该是 Iterators;他们的 iterator() 方法每次都应该真正返回一个新的 Iterator。
  • new Class() 与您的代码有什么关系(不是说它会起作用)?
  • 我无法正确打印出第一个到最后一个数字。它并没有真正告诉我错误来自哪里,但我不确定我是否以正确的方式使用 for 循环
  • 您的 iterator() 方法返回 null 几乎可以肯定是一个错误。我怀疑你得到了 NullPointerException?

标签: java class for-loop iterator implements


【解决方案1】:

你得到一个NullPointerException,因为你从iterator方法返回null...

@Override
public Iterator<Integer> iterator() {
    // TODO Auto-generated method stub
    return null;
}

iterator 方法应在每次调用时返回一个 iterator 的新实例。

您可以使用Iterator 的内部类,但在本例中,我将其分开,因为这使得IntegerIterator 更易于重用(恕我直言)...

IntegerLoop 类...

public class IntegerLoop implements Iterable<Integer> {

    int first, last;

    public IntegerLoop(int f, int l) {
        first = f;
        last = l;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new IntegerIterator(first, last);
    }
}

IntegerIterator 类...

public class IntegerIterator implements Iterator<Integer> {

    int first, last;
    int nextInt;

    public IntegerIterator(int first, int last) {
        this.first = first;
        this.last = last;
        this.nextInt = first;
    }

    @Override
    public boolean hasNext() {
        return nextInt >= first && nextInt <= last;
    }

    @Override
    public Integer next() {
        if (hasNext()) {
            int result = nextInt; // needs Iterator
            nextInt++;
            return result;
        }
        return null;
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub

    }

}

【讨论】:

  • 太棒了!感谢您的帮助!有没有办法通过实现 Iterator 和 Iterable 来让 IntegerLoop 工作,或者 java 只是不允许这样做?
  • @Alex 这真的没有意义,因为 iterator 方法真的需要在每次调用它时创建一个 Iterator 的新实例,你最终基本上会充当代理,但这只会变成噩梦般的混乱
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2013-02-20
  • 2011-03-18
相关资源
最近更新 更多