2016-07-15 136 views
0

我試圖解決這個問題,但不能。如何迭代java中的每個第二個元素

我需要實現一個實現迭代器,並採取迭代作爲構造參數的一類,

1)需要返回每個第二hasnext

2)需要

基本上返回每個第二下一個元素我試圖使用從構造函數接收給定的迭代器,但是當我使用hasnext上的下一個元素時,實際上是增加了一個元素的迭代器。所以問題出現時,我獨立訪問hasNext或下一個元素,並沒有通過所有的測試用例。在這個

模板的任何解決方案或想法和我預期的實現看起來象下面這樣:

public class AlternateIterator<T> implements Iterator<T> 
public AlternateIterator(Iterator<T> target) 

public boolean hasNext() { 
     boolean returnvalue = false; 
       if(iterator.hasNext()) { 
        iterator.next(); 
        returnvalue = iterator.hasNext(); 
       } 
       return returnvalue; 

    } 

    @Override 
    public T next() { 
     T object = null; 
     if(iterator.hasNext()) { 
     object = iterator.next(); 
     return object; 
     } 
     else 
      return null; 

- 通過此鏈接消失,但它會創建一個新的實現本身,而我只想使用指定的模板:

Can we write our own iterator in Java?

+0

一個for循環和一些((I&1)== 1)應該這樣做,你真的需要一些迭代器? – 2016-07-15 18:01:05

+0

你可以把一些條件分支內循環 – kpie

+0

我不投票接近不關閉的問題,但有http://stackoverflow.com/questions/16033711/java-iterating-over-every-two-elements-在列表 – 2016-07-15 18:04:12

回答

1

軌道是否你已經從源迭代器跳過的元素或沒有,像這樣:

import java.util.Iterator; 
import java.util.NoSuchElementException; 
import java.util.Objects; 

final class AlternateIterator<T> 
    implements Iterator<T> 
{ 

    static <T> Iterable<T> alternate(Iterable<T> original) 
    { 
    return() -> new AlternateIterator<>(original.iterator()); 
    } 

    private final Iterator<T> source; 

    private boolean skipped; 

    AlternateIterator(Iterator<T> source) 
    { 
    this.source = Objects.requireNonNull(source); 
    } 

    @Override 
    public boolean hasNext() 
    { 
    if (!skipped) { 
     if (source.hasNext()) 
     source.next(); 
     skipped = true; 
    } 
    return source.hasNext(); 
    } 

    @Override 
    public T next() 
    { 
    if (hasNext()) { 
     skipped = false; 
     return source.next(); 
    } 
    throw new NoSuchElementException(); 
    } 

    @Override 
    public void remove() 
    { 
    source.remove(); 
    } 

} 
+0

棒極了,你是真棒的人..保存我的一天,請教我如何編碼..謝謝很多:) –

0

你的問題是,hasNext()改變裝飾迭代器的狀態。您需要像skipped這樣的成員變量來跟蹤狀態,以便hasNext()不會雙重提前並跳過兩次,而您的實施next()應該使用this.hasNext()而不是iterator.hasNext()

編輯:它會是這個樣子:

public class AlternateIterator<T> implements Iterator<T> { 
    public AlternateIterator(Iterator<T> target) { ... } 

    private volatile boolean skipped = false; 

    public boolean hasNext() { 
     if (!skipped) { 
      skipped = true; 
      if (iterator.hasNext()) { 
       iterator.next(); 
      } 
     } 
     return iterator.hasNext(); 
    } 

    @Override 
    public T next() { 
     hasNext(); 
     skipped = false; 
     return iterator.next(); 
    } 
} 
+0

感謝您的期待,它看起來很有前途,讓我試試這一次.. –

+0

您可以先調用'next()',而不先調用'hasNext()'。在這種情況下,您的實現將無法跳過元素。 – erickson

+0

固定。接得好。 –

0

你需要有存儲如果hasNext以來一直接下來的最後一次通話稱爲布爾成員。 這樣你就可以知道是否需要在兩種方法中調用另一個。

+0

感謝您的迴應,它看起來很有希望 –

相關問題