繁体   English   中英

设计模式:迭代器模式

[英]Design patterns: Iterator pattern

    public BigDecimal next() {

        for (int i = 1; i < 100; i++) {
            BigDecimal cur = new BigDecimal(1);
            BigDecimal prev = new BigDecimal(0);

            final BigDecimal next = cur.add(prev);
            prev = cur;
            cur = next;
        }

        return cur;
    }

无法在此 for 循环中实现 Bigdecimal 以获取斐波那契数

在您的代码中,hasNext 始终为 false。 这告诉迭代器的消费者我们已经到达迭代的结尾。

这就是你想要达到的

我用 Integer 替换了所有 BigDecimal 引用。 如果您想保持原样,则需要进行一些小的更改。

//This is class with main method
import java.util.Iterator;

public class IteratorPattern {
public static void main(String[] args) {
    int n = 10;
    FibonacciSequence fibonacciSequence = new FibonacciSequence(n);

    System.out.println("iteration using iterator for-loop");

    //iteration using iterator for-loop
    for (Integer fibonacciNumber : fibonacciSequence) {
        System.out.println(fibonacciNumber);
    }

    System.out.println("iteration using iterator");

    //iteration using iterator
    Iterator<Integer> iterator = fibonacciSequence.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}
}

class FibonacciSequence implements Iterable<Integer>, Iterator<Integer> {

private final Integer n;
private Integer a;
private Integer b;
private int c = 1;

FibonacciSequence(Integer n) {
    this.n = n;
}

@Override
public Iterator<Integer> iterator() {
    return new FibonacciSequence(n);
}

@Override
public boolean hasNext() {
    return c <= n;
}

@Override
public Integer next() {
    c++;
    if (a == null && b == null) {
        a = 0;
        return 0;
    } else if (b == null) {
        b = 1;
        return b;
    } else if (a == 0 && b == 1) {
        a = 1;
        return b;
    }
    Integer temp = b;
    b = b + a;
    a = temp;
    return b;
}
}

Output:

 iteration using iterator for-loop
0
1
1
2
3
5
8
13
21
34
iteration using iterator
0
1
1
2
3
5
8
13
21
34

现在的重点是我做了什么改变。

  1. 正如@Tom S.所说,如果计数达到 n,您的 hasNext 方法应该返回 false。

  2. 我在下一个方法中更改了逻辑。 看看它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM