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, поэтому его легко импортировать и запускать как есть.