Можно ли сделать для каждого цикла в Java в обратном порядке?

Я думал об этом. Для OpenGL я бы закрепил SwapBuffers WGL с помощью Detours, рисовал мои вещи после игры, а затем сам менял буферы.

139
задан Ron Tuffin 8 July 2009 в 13:34
поделиться

7 ответов

Метод Collections.reverse фактически возвращает новый список с элементами исходного списка, скопированными в него в обратном порядке, так что его производительность O (n) по сравнению с размером оригинала. list.

В качестве более эффективного решения вы можете написать декоратор, который представляет перевернутый вид списка как объекта Iterable. Итератор, возвращаемый вашим декоратором, будет использовать ListIterator декорированного списка для обхода элементов в обратном порядке.

Например:

public class Reversed<T> implements Iterable<T> {
    private final List<T> original;

    public Reversed(List<T> original) {
        this.original = original;
    }

    public Iterator<T> iterator() {
        final ListIterator<T> i = original.listIterator(original.size());

        return new Iterator<T>() {
            public boolean hasNext() { return i.hasPrevious(); }
            public T next() { return i.previous(); }
            public void remove() { i.remove(); }
        };
    }

    public static <T> Reversed<T> reversed(List<T> original) {
        return new Reversed<T>(original);
    }
}

И вы бы использовали его так:

import static Reversed.reversed;

...

List<String> someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
    doSomethingWith(s);
}
148
ответ дан 23 November 2019 в 23:10
поделиться

Не обошлось и без написания специального кода, который предоставит вам перечислитель, который изменит элементы для вас.

Вы сможете сделать это на Java, создав собственную реализацию Iterable, которая вернет элементы в обратном порядке.

Затем вы должны создать экземпляр оболочки (или вызвать метод what-have-you), который вернет реализацию Iterable, которая меняет местами элемент в каждом цикле.

1
ответ дан 23 November 2019 в 23:10
поделиться

Это приведет к нарушению исходного списка, и его также необходимо вызывать вне цикла. Также вы не хотите выполнять обратный ход каждый раз, когда вы зацикливаете - это было бы так, если бы была применена одна из Iterables.reverse ideas ?

Collections.reverse(stringList);

for(String string: stringList){
//...do something
}
8
ответ дан 23 November 2019 в 23:10
поделиться

Для создания списка вы можете использовать библиотеку Google Guava :

for (String item : Lists.reverse(stringList))
{
    // ...
}

Обратите внимание, что Lists.reverse не переворачивает всю коллекцию и не делает ничего подобного это - он просто разрешает итерацию и произвольный доступ в обратном порядке. Это более эффективно, чем сначала перевернуть коллекцию.

Чтобы отменить произвольную итерацию, вам придется прочитать ее все, а затем «воспроизвести» в обратном порядке.

(Если вы еще не используете это, я d полностью рекомендую вам взглянуть на Guava . Это отличный материал.)

94
ответ дан 23 November 2019 в 23:10
поделиться

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

1
ответ дан 23 November 2019 в 23:10
поделиться

Насколько я знаю, в стандартной библиотеке нет стандартного типа «reverse_iterator», который поддерживает синтаксис for-each, который уже является синтаксическим сахаром, который они поздно внесли в язык.

Вы можете сделать что-то вроде для (Item element: myList.clone (). Reverse ()) и заплатить соответствующую цену.

Это также кажется вполне совместимым с очевидным явлением отсутствия удобных способов выполнения дорогостоящих операций - поскольку список по определению может иметь сложность произвольного доступа O (N) (вы можете реализовать интерфейс с помощью одинарной ссылки ), обратная итерация может закончиться O (N ^ 2). Конечно, если у вас есть ArrayList, вы не платите эту цену.

5
ответ дан 23 November 2019 в 23:10
поделиться

Вы можете использовать класс Collections http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html , чтобы переверните список, затем выполните цикл.

1
ответ дан 23 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: