Я думал об этом. Для OpenGL я бы закрепил SwapBuffers WGL с помощью Detours, рисовал мои вещи после игры, а затем сам менял буферы.
Метод 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);
}
Не обошлось и без написания специального кода, который предоставит вам перечислитель, который изменит элементы для вас.
Вы сможете сделать это на Java, создав собственную реализацию Iterable, которая вернет элементы в обратном порядке.
Затем вы должны создать экземпляр оболочки (или вызвать метод what-have-you), который вернет реализацию Iterable, которая меняет местами элемент в каждом цикле.
Это приведет к нарушению исходного списка, и его также необходимо вызывать вне цикла.
Также вы не хотите выполнять обратный ход каждый раз, когда вы зацикливаете - это было бы так, если бы была применена одна из Iterables.reverse ideas
?
Collections.reverse(stringList);
for(String string: stringList){
//...do something
}
Для создания списка вы можете использовать библиотеку Google Guava :
for (String item : Lists.reverse(stringList))
{
// ...
}
Обратите внимание, что Lists.reverse
не переворачивает всю коллекцию и не делает ничего подобного это - он просто разрешает итерацию и произвольный доступ в обратном порядке. Это более эффективно, чем сначала перевернуть коллекцию.
Чтобы отменить произвольную итерацию, вам придется прочитать ее все, а затем «воспроизвести» в обратном порядке.
(Если вы еще не используете это, я d полностью рекомендую вам взглянуть на Guava . Это отличный материал.)
Вам нужно будет перевернуть вашу коллекцию, если вы хотите использовать для каждого синтаксиса из коробки, и действовать в обратном порядке.
Насколько я знаю, в стандартной библиотеке нет стандартного типа «reverse_iterator», который поддерживает синтаксис for-each, который уже является синтаксическим сахаром, который они поздно внесли в язык.
Вы можете сделать что-то вроде для (Item element: myList.clone (). Reverse ()) и заплатить соответствующую цену.
Это также кажется вполне совместимым с очевидным явлением отсутствия удобных способов выполнения дорогостоящих операций - поскольку список по определению может иметь сложность произвольного доступа O (N) (вы можете реализовать интерфейс с помощью одинарной ссылки ), обратная итерация может закончиться O (N ^ 2). Конечно, если у вас есть ArrayList, вы не платите эту цену.
Вы можете использовать класс Collections http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html , чтобы переверните список, затем выполните цикл.