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

Как перевернуть массив в Java

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

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

В этой быстрой статье мы покажем, как мы можем инвертировать массив в Java.

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

Далее мы рассмотрим два решения с использованием внешних библиотек — одно с использованием Apache Commons Lang и одно с использованием Google Guava .

2. Определение проблемы

Основная идея состоит в том, чтобы изменить порядок элементов в массиве на обратный. Итак, если задан массив:

fruits = {"apples", "tomatoes", "bananas", "guavas", "pineapples"}

Мы хотели бы получить:

invertedFruits = {"pineapples", "guavas", "bananas", "tomatoes",  "apples"}

Давайте посмотрим, как мы можем это сделать.

3. Использование традиционного цикла for

Первый способ, которым мы могли бы подумать об инвертировании массива, — это использовать цикл for :

void invertUsingFor(Object[] array) {
for (int i = 0; i < array.length / 2; i++) {
Object temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}

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

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

4. Использование потокового API Java 8

Мы также можем инвертировать массив с помощью Stream API:

Object[] invertUsingStreams(Object[] array) {
return IntStream.rangeClosed(1, array.length)
.mapToObj(i -> array[array.length - i])
.toArray();
}

Здесь мы используем метод IntStream.range для генерации последовательного потока чисел. Затем мы отображаем эту последовательность в индексы массива в порядке убывания.

5. Использование Collections.reverse()

Давайте посмотрим, как инвертировать массив с помощью метода Collections.reverse() :

public void invertUsingCollectionsReverse(Object[] array) {
List<Object> list = Arrays.asList(array);
Collections.reverse(list);
}

По сравнению с предыдущими примерами, это более читабельный способ выполнения задачи.

6. Использование Apache Commons Lang

Другой вариант инвертирования массива — использовать библиотеку Apache Commons Lang . Чтобы использовать его, мы должны сначала включить библиотеку в качестве зависимости:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

Последнюю версию Commons Lang можно найти на Maven Central .

Давайте используем класс ArrayUtils для инвертирования массива:

public void invertUsingCommonsLang(Object[] array) {
ArrayUtils.reverse(array);
}

Как мы видим, это решение довольно простое.

7. Использование Google Гуавы

Еще один вариант — использовать библиотеку Google Guava . Как и в случае с Commons Lang , мы включим библиотеку в качестве зависимости:

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

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

Затем мы можем использовать обратный метод в классе Lists Guava, чтобы инвертировать массив: ``

public Object[] invertUsingGuava(Object[] array) {
List<Object> list = Arrays.asList(array);
List<Object> reversed = Lists.reverse(list);
return reversed.toArray();
}

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

В этой статье мы рассмотрели несколько различных способов инвертирования массива в Java. Мы показали несколько решений, использующих только ядро Java, и два других решения, использующих сторонние библиотеки — Commons Lang и Guava .

Все примеры кода, показанные здесь, можно найти на GitHub — это проект Maven, поэтому его легко импортировать и запускать как есть.