2016-07-15 4 views
0

Я попытался это обработать, но не смог.как перебирать каждый второй элемент в java

Мне нужно реализовать класс, который реализует итератор и принимает итератор в качестве параметра конструктора,

1) Нужно вернуться каждые 2 hasnext

2) Нужно вернуться каждые 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

для цикла и некоторые ((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() изменяет состояние украшенного итератора. Вам нужна переменная-член как skipped для отслеживания состояния, так что hasNext() не будет удваивать заранее и пропускать два, и ваша реализация next() должна использовать this.hasNext(), а не iterator.hasNext().

Edit: это будет выглядеть примерно так:

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()' first. В этом случае ваша реализация не сможет пропустить элементы. – erickson

+0

Исправлено. Хороший улов. –

0

Вы должны иметь логический член, который хранит если hasNext была вызвана с момента последнего вызова следующего. Таким образом, вы знаете, если вам нужно вызвать дополнительный следующий или нет в обоих методах.

+0

Спасибо за ответ, выглядит многообещающе –

Смежные вопросы