Reversing arraylist in java

How to Reverse ArrayList in Java with Example

To reverse an ArrayList in java, one can use Collections class reverse method i.e Collections.reverse() method. Collections reverse method reverses the element of ArrayList in linear time i.e time complexity is O(n). Collections reverse method accepts a List type as an argument. So any List type can be reversed i.e LinkedList, Vector or any custom implementation. Lets write the java program to reverse an ArrayList in java.

Java Program to Reverse ArrayList in Java

Below is the java program to reverse ArrayList in java. In the program we have added tech companies name in ascending order, after calling reverse method the names will be printed in descending order.

import java.util.*; public class ReverseArrayList  public static void main(String[] args)  //Creating an ArrayList object ArrayListString> arrlist = new ArrayListString>(); 
//Adding elements to ArrayList object 
arrlist.add("Apple"); arrlist.add("Amazon"); arrlist.add("Facebook"); arrlist.add("Google"); arrlist.add("IBM"); arrlist.add("Tesla"); //Displaying ArrayList Before Reverse System.out.println("Before Reverse ArrayList:"); System.out.println(arrlist); /*Reversing the list using 
 Collections.reverse() method*/ Collections.reverse(arrlist); //Displaying list after reverse System.out.println("After Reverse ArrayList:"); System.out.println(arrlist); > > 
Output : Before Reverse ArrayList: [Apple, Amazon, Facebook, Google, IBM, Tesla] After Reverse ArrayList: [Tesla, IBM, Google, Facebook, Amazon, Apple] 

Java Program to Reverse LinkedList in Java

import java.util.*; public class ReverseLinkedList  public static void main(String[] args)  //Creating a LinkedList object LinkedListInteger> linkedlist = new LinkedListInteger>(); 
//Adding elements to LinkedList object 
linkedlist.add(23); linkedlist.add(42); linkedlist.add(56); linkedlist.add(75); linkedlist.add(78); linkedlist.add(80); linkedlist.add(96); //Displaying linkedlist before reverse System.out.println("Before Reverse LinkedList:"); System.out.println(linkedlist); /*Reversing the list using 
 Collections.reverse() method*/ Collections.reverse(linkedlist); //Displaying linkedlist after reverse System.out.println("After Reverse LinkedList:"); System.out.println(linkedlist); > > 
Output : Before Reverse LinkedList: [23, 42, 56, 75, 78, 80, 96] After Reverse LinkedList: [96, 80, 78, 75, 56, 42, 23] 

Please mention in comments if you know any other way to reverse the ArrayList in Java or reverse the LinkedList in java.

About The Author

Subham Mittal has worked in Oracle for 3 years.
Enjoyed this post? Never miss out on future posts by subscribing JavaHungry

Источник

Обратный ArrayList в Java

ArrayList — это часто используемая реализация List в Java.

В этом руководстве мы рассмотрим, как реверсировать ArrayList .

2. Введение в проблему​

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

 ListInteger> aList = new ArrayList>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); 

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

 ListInteger> EXPECTED = new ArrayList>(Arrays.asList(7, 6, 5, 4, 3, 2, 1)); 

Таким образом, требование выглядит довольно простым. Однако проблема может иметь несколько вариантов:

  • Реверсирование списка на месте
  • Обращение списка и возврат результата в виде нового объекта списка

В этом уроке мы рассмотрим оба случая.

Стандартная библиотека Java предоставила вспомогательный метод для выполнения этой работы. Посмотрим, как мы можем быстро решить проблему, используя этот метод.

Кроме того, учитывая, что некоторые из нас могут изучать Java, мы рассмотрим две интересные, но эффективные реализации реверсирования List .

Далее давайте посмотрим на них в действии.

3. Использование стандартного метода Collections.reverse ​

Стандартная библиотека Java предоставляет метод Collections.reverse для изменения порядка элементов в заданном List .

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

 ListInteger> aList = new ArrayList>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));   Collections.reverse(aList);   assertThat(aList).isEqualTo(EXPECTED); 

Когда мы выполняем тест выше, он проходит. Как мы видели, мы передали объект aList обратному методу, после чего порядок элементов в объекте aList меняется на противоположный.

Если мы не хотим изменять исходный List и ожидаем получить новый объект List , содержащий элементы в обратном порядке, мы можем передать новый объект List обратному методу:

 ListInteger> originalList = new ArrayList>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));   ListInteger> aNewList = new ArrayList>(originalList);   Collections.reverse(aNewList);    assertThat(aNewList).isNotEqualTo(originalList).isEqualTo(EXPECTED); 

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

Как видно из двух приведенных выше примеров, стандартный метод Collections.reverse довольно удобен для реверсирования List .

Однако, если мы изучаем Java, возможно, мы хотим сами попрактиковаться в реализации «обратного» метода.

Далее давайте рассмотрим пару хороших реализаций: одну с использованием рекурсии, а другую с использованием простого цикла.

4. Реверсирование списка с помощью рекурсии​

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

 public static T> void reverseWithRecursion(ListT> list)    if (list.size() > 1)    T value = list.remove(0);   reverseWithRecursion(list);   list.add(value);   >   > 

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

В каждом вызове рекурсии мы выполняем « T value = list.remove(0) », извлекая первый элемент из списка. Это работает следующим образом:

 recursion step 0: value = null, list = (1, 2, 3, ... 7)   |_ recursion step 1: value = 1, list = (2, 3, 4,...7)   |_ recursion step 2: value = 2, list = (3, 4, 5, 6, 7)   |_ recursion step 3: value = 3, list = (4, 5, 6, 7)   |_ ...  |_ recursion step 6: value = 6, list = (7) 

Как мы видим, когда объект списка содержит только один элемент (7), мы останавливаем рекурсию и начинаем выполнять list.add(value) снизу. То есть сначала добавляем в конец списка 6, потом 5, потом 4 и так далее. В конце концов, порядок элементов в списке был изменен на противоположный. Кроме того, этот метод работает за линейное время .

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

 ListInteger> aList = new ArrayList>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));   ReverseArrayList.reverseWithRecursion(aList);   assertThat(aList).isEqualTo(EXPECTED); 

Если мы запустим тест, он пройдет. Итак, наша реализация рекурсии решает проблему.

5. Обращение списка с помощью итерации​

Мы только что перевернули список, используя рекурсию. В качестве альтернативы мы можем решить проблему с помощью итерации.

Во-первых, давайте посмотрим на реализацию:

 public static T> void reverseWithLoop(ListT> list)    for (int i = 0, j = list.size() - 1; i  j; i++)    list.add(i, list.remove(j));   >   > 

Как мы видим, реализация итерации также довольно аккуратна. Однако у нас есть только один цикл for , и в теле цикла у нас есть только один единственный оператор.

Далее давайте разберемся, как это работает.

Мы определили два указателя i и j на заданный список. Указатель j всегда указывает на последний элемент в списке. Но точка i увеличивается от 0 до j-1 .

Мы удаляем последний элемент на каждом шаге итерации и заполняем его до i-й позиции, используя list.add(i, list.remove(j)) . Когда i достигает j-1 , цикл завершается, и мы переворачиваем список:

 Iteration step 0: i = j = null, list = (1, 2, 3,...7)  Iteration step 1: i = 0; j = 6   |_ list.add(0, list.remove(6))   |_ list = (7, 1, 2, 3, 4, 5, 6)  Iteration step 2: i = 1; j = 6   |_ list.add(1, list.remove(6))   |_ list = (7, 6, 1, 2, 3, 4, 5)   ... Iteration step 5: i = 4; j = 6   |_ list.add(4, list.remove(6))   |_ list = (7, 6, 5, 4, 3, 1, 2)  Iteration step 6: i = 5; j = 6   |_ list.add(5, list.remove(6))   |_ list = (7, 6, 5, 4, 3, 2, 1) 

Метод также работает в линейном времени.

Наконец, давайте проверим наш метод и посмотрим, работает ли он так, как ожидалось:

 ListInteger> aList = new ArrayList>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));   ReverseArrayList.reverseWithLoop(aList);   assertThat(aList).isEqualTo(EXPECTED); 

Когда мы запускаем тест выше, он проходит.

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

В этой статье мы рассмотрели, как реверсировать ArrayList на примерах. Стандартный метод Collections.reverse очень удобен для решения этой проблемы.

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

Как обычно, полный код этой статьи можно найти на GitHub .

Источник

Java ArrayList reverse example

Java ArrayList reverse example shows how to reverse ArrayList in Java. The example also shows various ways to do that in detail.

How to reverse ArrayList in Java?

There are a couple of ways using which you can reverse ArrayList in Java.

1) Reverse ArrayList using for loop

2) Reverse ArrayList using Collections class

The simplest way is to use reverse method of Collections class as given in the below example.

Please note that reverse method throws UnsupportedOperationException if the specified List does not support the Set operation.

How does the reverse method of the Collections class work?

Let’s have a look at the source code of the Collections class. This snippet is directly taken from the source code of OpenJDK version 6.

As you can see, it uses REVERSE_THRESHOLD and List’s size along with the type of List to determine the best performing approach to reverse the List. REVERSE_THRESHOLD is defined as,

So if the argument List’s size is less than 18 or if the list is inherited from RandomAccess, it uses for loop to reverse the list by swapping the elements. If the list size is equal to or more than 18, it uses ListIterator to swap the elements and reverse the list.

Note: If you just want to iterate the list in reverse order and do not want to change the original list by reversing it, have a look at how to iterate the ArrayList in reverse order example.

This example is a part of the ArrayList in Java tutorial.

Please let me know your views in the comments section below.

About the author

I have a master’s degree in computer science and over 18 years of experience designing and developing Java applications. I have worked with many fortune 500 companies as an eCommerce Architect. Follow me on LinkedIn and Facebook.

Источник

Читайте также:  Proxy server with java
Оцените статью