Итератор в обратном порядке - для функции lowerRight - PullRequest
0 голосов
/ 17 февраля 2019

Попытка реализовать некоторые функции ReduRight.Для производительности было бы неплохо перебирать справа налево, не переворачивая все сначала, а потом идти слева направо.Обычно мы делаем:

Iteratable iterable ...;
Iterator iterator = iterable.iterator();
iterator.next();

, но я ищу что-то вроде:

Iteratable iterable ...;
Iterator iterator = iterable.reverseIterator();
iterator.next();

Я вижу это решение: Итерация по списку в обратном порядке в Java

Текущий принятый ответ говорит, что это работает:

ArrayList<...> a = new ArrayList<...>();

// Add elements to list.

// Generate an iterator. Start just after the last element.
ListIterator li = a.listIterator(a.size());

// Iterate in reverse.
while(li.hasPrevious()) {
  System.out.println(li.previous());
}

Кто-нибудь знает, как реализовать обратную итерацию, имея только Iterable в руке?У меня нет ArrayList или Списка в руке, у меня есть Iterable в руке.Я полагаю, я могу преобразовать Iterable в ArrayList, перевернуть список, затем получить итератор, но это было бы неинтересно:)

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Простой ответ: невозможно в общем виде.

Суть итератора состоит в том, чтобы получить одно направление, а не оба.И представьте единый связанный список.Эта вещь действительно имеет «только одно направление»!

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

0 голосов
/ 17 февраля 2019

Если у вас есть Iterable в руке, как вы написали в своем вопросе, то кто-то предоставил вам его.Я бы предложил попросить поставщика предоставить Iterable, который поддерживает обратную итерацию.

0 голосов
/ 17 февраля 2019

Вам нужно будет выполнить итерацию по исходному Iterator один раз, чтобы построить обратное Iterator (при условии, что ваш исходный Iterator конечен).

Например:

static <T> Iterator<T> getReversedIterator(Iterable<T> iterable) {
    Iterator<T> iter = iterable.iterator();
    List<T> rev = new ArrayList<>();
    while (iter.hasNext()) {
        rev.add (0, iter.next());
    }
    return rev.iterator();
}
...