Мне нужно запустить список в обратном порядке, используя Java.
Так, где это делает это вперед:
for(String string: stringList){
//...do something
}
Есть ли способ перебирать stringList в обратном порядке, используя для каждого синтаксиса?
Для ясности: я знаю, как перебирать список в обратном порядке, но хотел бы знать (ради любопытства), как это сделать для каждого стиля.
Set
производных коллекций.foreach
гарантирует итерацию в порядке итератора, возвращаемого изiterator()
метода коллекции. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlОтветы:
Метод Collections.reverse фактически возвращает новый список с элементами оригинального списка, скопированными в него в обратном порядке, поэтому он имеет производительность O (n) по отношению к размеру исходного списка.
В качестве более эффективного решения вы можете написать декоратор, который представляет перевернутое представление списка как итерируемого. Итератор, возвращаемый вашим декоратором, будет использовать ListIterator декорированного списка для обхода элементов в обратном порядке.
Например:
И вы бы использовали это как:
источник
Для списка вы можете использовать библиотеку Google Guava :
Обратите внимание, что это не переворачивает всю коллекцию и не делает ничего подобного - она просто позволяет выполнять итерацию и произвольный доступ в обратном порядке. Это более эффективно, чем сначала изменить коллекцию.
Lists.reverse
Чтобы отменить произвольную итерацию, вам нужно прочитать все и затем «переиграть» назад.
(Если вы не используете его, я тщательно рекомендую вам взглянуть на гуавы . Это отличный материал.)
источник
Список (в отличие от набора) представляет собой упорядоченную коллекцию, и ее повторение сохраняет порядок по контракту. Я бы ожидал, что стек будет повторяться в обратном порядке, но, к сожалению, это не так. Итак, самое простое решение, которое я могу придумать, это:
Я понимаю, что это не решение для каждого цикла. Я бы предпочел использовать цикл for, а не представлять новую библиотеку, например, Google Collections.
Collections.reverse () также выполняет эту работу, но обновляет список, а не возвращает копию в обратном порядке.
источник
for each
синтаксисЭто будет мешать исходному списку и также должно вызываться вне цикла. Кроме того, вы не хотите выполнять реверс каждый раз, когда делаете цикл - будет ли это верно, если один из них
Iterables.reverse ideas
был применен?источник
AFAIK, в стандартной библиотеке нет стандартного вида "reverse_iterator", который бы поддерживал синтаксис for-each, который уже является синтаксическим сахаром, который они привнесли в язык позднее.
Вы можете сделать что-то вроде для (Элемент Item: myList.clone (). Reverse ()) и заплатить соответствующую цену.
Это также вполне согласуется с явным явлением, заключающимся в отсутствии удобных способов выполнения дорогостоящих операций - поскольку список по определению может иметь O (N) сложность произвольного доступа (вы могли бы реализовать интерфейс с одиночной связью), наоборот итерация может в конечном итоге быть O (N ^ 2). Конечно, если у вас есть ArrayList, вы не платите эту цену.
источник
Это может быть вариантом. Надеюсь, что есть лучший способ начать с последнего элемента, чем цикл while до конца.
источник
Что касается комментария : вы должны быть в состоянии использовать Apache Commons
ReverseListIterator
Как сказал @rogerdpack , вам нужно обернуть его
ReverseListIterator
какIterable
.источник
Не без написания специального кода, который даст вам перечислитель, который обратит элементы за вас.
Вы должны быть в состоянии сделать это в Java, создав собственную реализацию Iterable, которая будет возвращать элементы в обратном порядке.
Затем вы должны создать экземпляр оболочки (или вызвать метод what-have-you), который вернет реализацию Iterable, которая переворачивает элемент в каждом цикле.
источник
Вы можете использовать класс Collections http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html, чтобы перевернуть список, а затем выполнить цикл.
источник
Вам нужно будет отменить свою коллекцию, если вы хотите использовать для каждого синтаксиса из коробки и идти в обратном порядке.
источник
Все ответы, приведенные выше, только удовлетворяют требованию, либо заключая в оболочку другой метод, либо вызывая внешний код;
Вот решение, скопированное из Thinking in Java 4th edition , глава 11.13.1 AdapterMethodIdiom ;
Вот код:
источник
int current = size() - 1
правильно? почему неint current = this.size() - 1
илиint current = super.size() - 1
Работа вокруг:
Или с гуавой :
источник
Определенно поздний ответ на этот вопрос. Одной из возможностей является использование ListIterator в цикле for. Это не так чисто, как синтаксис двоеточия, но это работает.
Кредит на синтаксис ListIterator идет в «Пути перебора списка в Java»
источник