2015-07-11 47 views
3

我想編寫一個類(稱爲Seii),它基本上是從s0開始的一系列整數。 S0設置在構造:使用迭代器創建一個系列

se + 1 = 3*(se/2) 

美中不足的是:一個for循環應該能夠通過這個類的對象進行迭代和吐出序列的元素(不起始編號S0)。

for(int i:new Seii(2)){ 

     System.out.println(i) 

給出::另外,該序列的第一個元素大於42

例如結束

3,4,6,9,10,15,16,24,36,54

我想使用迭代器來做到這一點。有人能幫助我嗎? 我的想法是重寫next()方法,以便它爲序列的下一個元素進行計算,但是我沒有得到任何關於這個邏輯的地方。

public class Seii<T> implements Iterator { 
    private ArrayList<Integer> list = new ArrayList<>(); 
    Iterator<Integer> it = list.iterator(); 
    private final int size; 
    public Seii(int size) { 
    this.size = size; 
    } 

    int seii = 0; 

    @Override 
    public boolean hasNext() { 
    // TODO Auto-generated method stub 
    return false; 
    } 
    @Override 
    public Object next() { 
    if ((size % 2) == 0) { 
     seii = 3 * (seii/2); 
     return seii; 
    } 
    } 

    } 
    } 

這是我的實現。

+0

爲什麼'Iterator'而不是'Stream'? –

+0

你可以展示你到目前爲止實現這個目標嗎? – dasblinkenlight

+0

@BoristheSpider,因爲我正在學習如何使用迭代器,並且顯然有很好的迭代器實現。 –

回答

3

Seii應該實現Iterable<Integer>,這將允許它支持增強的for循環語法。這樣做,恕我直言,最簡單的方式,就是有一個內部Iterator類,它實現你的邏輯:

public class Seii implements Iterable<Integer> { 
    private class SeiiIterator implements Iterator<Integer> { 
     @Override 
     public boolean hasNext() { 
      return value <= 42; 
     } 

     @Override 
     public Integer next() { 
      if (!hasNext()) { 
       throw new NoSuchElementException(); 
      } 

      value = 3 * (value/2); 
      return value; 
     } 
    } 


    private int value; 

    public Seii(int value) { 
     this.value = value; 
    } 

    @Override 
    public Iterator<Integer> iterator() { 
     return new SeiiIterator(); 
    } 
} 
+1

我不喜歡這樣做,因爲'value'存儲在'Iterable'中,這將綁定'Iterator'到'Iterator'。這違反了基本合同,並且會在許多用例中失敗 - 例如,嵌套循環。 –

0

您的Seii類應執行Iterable<Integer>而不是Iterator,因爲這是增強for循環所需的接口。它將有一個iterator方法,該方法返回一個實現Iterator<Integer>接口的類的實例。

+0

感謝哥們,我錯過了那一個 –

3

您不需要存儲序列,因此可以從您的實現中刪除數組列表。所有你需要的是最後的值,可以在構造函數中設置:

// This is a wrapper class that constructs iterators. 
// It is used for plugging in your code into enhanced "for" loop 
class Seii implements Iterable<Integer> { 
    private int current; 
    private int max; 
    public Seii(int current, int max) { 
     this.current = current; 
     this.max = max; 
    } 
    @Override 
    public Iterator<Integer> iterator() { 
     return new SeiIterator(current, max); 
    } 
} 
// This is the actual iterator that maintains state 
// and produces the desired sequence. 
class SeiIterator implements Iterator<Integer> { 
    private int current; 
    private int max; 
    public SeiIterator(int current, int max) { 
     this.current = current; 
     this.max = max; 
    } 
    @Override 
    public boolean hasNext() { 
     return current < max; 
    } 
    @Override 
    public Integer next() { 
     current = (3*current)/2; 
     return current; 
    } 
    @Override 
    public void remove() { 
     throw new UnsupportedOperationException(); 
    } 
} 

注意的是,爲了使用迭代器在增強for循環你需要用它在Iterable<Integer>

Demo.

+0

感謝隊友,這個實現也可以,但上面的其他實現是我正在尋找的。 –

+0

@TonyOkoth這是相同的實現,真的 - 差異是表面化的(例如迭代器內部的其他實現硬編碼42,並且使用嵌套類而不是獨立類)。這是因爲其他實現因爲括號放置而無法工作(你看到它了嗎?) – dasblinkenlight