这是我写的一个实现Iterable< Integer>的类.算术系列(从步骤开始到停止)
package com.example.test; import java.util.Iterator; import com.google.common.collect.AbstractIterator; public class ArithmeticSeries implements Iterable<Integer> { final private int start,step,stop; public int getStart() { return this.start; } public int getStep() { return this.step; } public int getStop() { return this.stop; } public ArithmeticSeries(int start,int step,int stop) { this.start = start; this.step = step; this.stop = stop; } @Override public Iterator<Integer> iterator() { return new AbstractIterator<Integer>() { private Integer n = null; @Override protected Integer computeNext() { int next; if (this.n == null) { next = getStart(); } else { next = this.n + getStep(); if ((getStep() > 0 && next > getStop()) || (getStep() < 0 && next < getStop())) return endOfData(); } this.n = next; return next; } }; } @Override public String toString() { return getStart()+":"+getStep()+":"+getStop(); } public static void main(String[] args) { Iterable<Integer> range = new ArithmeticSeries(100,-1,80); System.out.println(range); for (int i : range) System.out.println(i); } }
有没有办法实现更优雅的iterator()?我不喜欢null检查和使用Integer(替代将是一个额外的标志boolean firstTime),它似乎错了.
解决方法
return new AbstractIterator<Integer>() { int next = getStart(); @Override protected Integer computeNext() { if (isBeyondEnd(next)) { return endOfData(); } Integer result = next; next = next + getStep(); return result; } };
如果您愿意,您可以将其实现为不可变List< Integer>.如果您扩展AbstractList,那么Iterator将为您处理.实际上,我认为AbstractList真的是最好的方式.全班看起来像这样(我没有检查它在所有情况下都能正常工作):
public class ArithmeticSeries extends AbstractList<Integer> { private final int start; private final int step; private final int size; public ArithmeticSeries(int start,int end,int step) { this.start = start; this.step = (start < end) ? step : -step; this.size = (end - start) / this.step + 1; } @Override public Integer get(int index) { return start + step * index; } @Override public int size() { return size; } }