Перейти к основному содержимому

Итерация назад по списку

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы узнаем о различных способах итерации списка в Java в обратном порядке.

2. Итератор в Java

Iterator — это интерфейс в Java Collections Framework , который позволяет нам перебирать элементы в коллекции. Он был представлен в Java 1.2 как замена Enumeration .

3. Итерация в обратном направлении с использованием Core Java

3.1. Обратный цикл _

Самая простая реализация — использовать цикл for , чтобы начать с последнего элемента списка и уменьшить индекс по мере достижения начала списка:

for (int i = list.size(); i-- > 0; ) {
System.out.println(list.get(i));
}

3.2. ListIterator

Мы можем использовать ListIterator для перебора элементов в списке.

Предоставление размера списка в качестве индекса для ListIterator даст нам итератор, указывающий на конец списка:

ListIterator listIterator = list.listIterator(list.size());

Этот итератор теперь позволяет нам перемещаться по списку в обратном направлении:

while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}

3.3. Коллекции.reverse()

Класс Collections в Java предоставляет статический метод для изменения порядка элементов в указанном списке:

Collections.reverse(list);

Затем перевернутый список можно использовать для перебора исходных элементов в обратном направлении:

for (String item : list) {
System.out.println(item);
}

Однако этот метод переворачивает фактический список, изменяя порядок элементов на месте , и во многих случаях может быть нежелательным.

4. Итерация в обратном направлении с использованием Apache ReverseListIterator

В библиотеке Apache Commons Collections есть хороший класс ReverseListIterator , который позволяет нам перебирать элементы в списке, фактически не реверсируя его.

Прежде чем мы начнем, нам нужно импортировать последние зависимости из Maven Central :

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

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

ReverseListIterator reverseListIterator = new ReverseListIterator(list);

Затем мы можем использовать этот итератор для обхода списка в обратном направлении:

while (reverseListIterator.hasNext()) {
System.out.println(reverseListIterator.next());
}

5. Итерация в обратном направлении с использованием Lists.reverse() в Guava

Точно так же библиотека Google Guava также предоставляет статический метод reverse() в своем классе Lists , который возвращает обратное представление предоставленного списка.

Последнюю версию Guava можно найти на Maven Central :

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Вызов статического метода reverse() в классе Lists дает нам список в обратном порядке:

List<String> reversedList = Lists.reverse(list);

Затем перевернутый список можно использовать для итерации в обратном направлении по исходному списку:

for (String item : reversedList) {
System.out.println(item);
}

Этот метод возвращает новый список с элементами исходного списка в обратном порядке .

6. Заключение

В этой статье мы рассмотрели различные способы перебора списка в обратном направлении в Java. Мы рассмотрели несколько примеров с использованием ядра Java, а также популярных сторонних библиотек.

Исходный код этой статьи и соответствующие тестовые примеры доступны на GitHub .