2016-07-15 3 views
0

私はこれを解決しようとしましたができませんでした。どのようにJavaのすべての2番目の要素を反復する

私は

1、イテレータを実装し、コンストラクタのパラメータとしてイテレータを取るクラスを実装する必要があります))は、すべての第二のhasNext

2を返す必要が基本的にすべての第二次の要素

を返す必要があります私はコンストラクタから受け取った与えられたイテレータを使用しようとしていますが、次の要素をhasnextで使用すると、イテレータは実際には1つの要素だけ増加しています。だから私は独立してhasNextまたはnext要素にアクセスし、すべてのテストケースを通過しないと問題が発生します。この

テンプレートと私の予想実装上の任意の解決策やアイデアは以下のようになります。

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

ループとそれを行う必要があり、いくつかの((I&1)== 1)のために、本当にあなたを行いますいくつかのイテレータが必要ですか? –

+0

あなたがループ – kpie

+0

内でいくつかの条件分岐を置くことができ、私は質問を閉じないために近い投票が、http://stackoverflow.com/questions/16033711/java-iterating-over-every-two-elements-ありませんin-a-list –

答えて

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()が飾らイテレータの状態を変更することです。あなたはhasNext()ダブル事前ず、2をスキップして、next()の実装がthis.hasNext()、ないiterator.hasNext()を使用する必要がありますように、状態を追跡するためにskippedのようなメンバ変数を必要としています。

編集:あなたはの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

おかげで、それは有望に見える、私は一度これを試してみましょう。..イテレータを有する少なくとも一つの答えを数えますが、OK、コンストラクタを介して受信した私は...イテレータの使用をする必要があると私は、元のリストへのアクセス –

+0

最初に 'hasNext()'を呼び出さずに 'next()'を呼び出すことができます。その場合、実装は要素をスキップできません。 – erickson

+0

修正されました。良いキャッチ。助けてくれてありがとう@DavidEhrmann –

0

:それはこのような何かを見てみましょう。 この方法では、両方の方法でnextまたはnextを追加する必要があるかどうかを知ることができます。このような

+0

おかげで、それは有望に見える –