Как поменять элементы массива в обратном порядке в Java?
Как поменять элементы массива в обратном порядке?
class Test {
public static void main(String[] args){
int[] a = {1,2,3,4,5,6,7,8};
}
}
}
Ответы (2 шт):
Делаете цикл от 0 до
floor(длинаМассива/2)- гдеfloorэто округление в меньшую сторону. Это нужно если количество элементов в массиве не чётное.На каждой итерации меняете значение на позиции
iс позицией надлинаМассива - i - 1. Можно использовать третью переменню если угодно, т.е.tmp = arr[i]; arr[i] = arr[arr.length - i - 1]; arr[arr.length - i - 1] = tmpВсё
Если имеется в виду вариант: что нужно сделать нисходящую сортировку даже в массиве, где идут значения не по порядку - тогда вам надо смотреть любые алгоритмы сортировок. Их очень много
https://academy.yandex.ru/posts/osnovnye-vidy-sortirovok-i-primery-ikh-realizatsii , + https://habr.com/ru/post/335920/
- Сортировка "пузырьком" (как раз для новичков)
- Сортировка вставками
- Сортировка посредством выбора
- Сортировка перемешиванием (шейкерная сортировка)
- Сортировка расчёской
- Сортировка выбором
- и т.д.
Для массивов объектов достаточно просто использовать сочетание методов Collections.reverse + Arrays.asList:
Arrays.asListсоздает нерасширяемый список на основании массива, и все изменения в списке будут отражаться в исходном массивеCollections.reverseпереставляет элементы списка в обратном порядке, соответственно изменяя расположение элементов в массиве
public static<T> void reverse(T[] arr) {
Collections.reverse(Arrays.asList(arr));
}
Для массивов примитивных типов таких как целочисленные int, long, short, byte, символьный char, с плавающей точкой double, float, булевый boolean следует обменять между собой элементы в начале и конце массива.
Примерная реализация для целых чисел (без применения промежуточной переменной для перестановки элементов с использованием XOR):
public static void reverse(int[] arr) { // аналогично для byte, boolean, short, char, long
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
arr[j] = arr[j] ^ arr[i] ^ (arr[i] = arr[j]);
}
}
Для массива символов char дополнительно можно воспользоваться функционалом класса StringBuilder, в котором есть свой метод reverse, а также метод getChars, позволяющий скопировать данные из экземпляра StringBuilder. В целом такой способ затратнее по памяти, так как StringBuilder создаст свой внутренний массив:
public static void reverse(char[] arr) {
new StringBuilder(arr.length).append(arr).reverse().getChars(0, arr.length, arr, 0);
}
Для массивов чисел с плавающей точкой следует воспользоваться третьей переменной для обмена значений, так как XOR для таких чисел не применим, а обмен при помощи суммы может оказаться неточным из-за погрешностей округления.
public static void reverse(double[] arr) { // аналогично для float
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
double t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}