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

Я пытаюсь изменить массив int в Java.

Этот метод не переворачивает массив.

for(int i = 0; i < validData.length; i++)
{
    int temp = validData[i];
    validData[i] = validData[validData.length - i - 1];
    validData[validData.length - i - 1] = temp;
}

Что с этим не так?


person MichaelScott    schedule 26.01.2010    source источник
comment
Я вижу, что я сделал неправильно. Должен быть действительнымДата.длина/2. В противном случае он реверсирует себя, а затем не реверсирует себя.   -  person MichaelScott    schedule 26.01.2010
comment
См. en.wikipedia.org/wiki/In-place_algorithm, где содержится описание правильная версия этого алгоритма.   -  person Dean Povey    schedule 26.01.2010
comment
Java 8: stackoverflow.com/a/46756353/1216775   -  person akhil_mittal    schedule 29.10.2018


Ответы (40)


Чтобы перевернуть массив int, вы меняете местами элементы, пока не достигнете средней точки, например так:

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

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

person 3lectrologos    schedule 26.01.2010
comment
И я хотел бы поместить часть validData.length / 2 за пределы цикла for. - person Jin Kwon; 10.03.2014
comment
@ Джин, я бы не стал. Это только запутывает смысл, и я уверен, что оптимизирующий компилятор все равно сделает это за вас. Несмотря на это, нет смысла в микрооптимизации, пока у вас нет четких доказательств из профилирования, что это необходимо/полезно. - person Nicu Stiurca; 07.04.2014
comment
@JinKwon Это было бы похоже на validData.length >> 1. Это эквивалентно и быстрее, но это сбивает с толку многих программистов, и любой хороший компилятор автоматически сделает это. - person Justin; 07.04.2014
comment
Вы должны сделать это вычисление только один раз validData.length - i - 1 и сохранить его в переменной. - person ; 20.05.2015
comment
Может ли кто-нибудь предложить изменение без временной переменной !! - person sg28; 11.07.2018
comment
@ sg28, который уже был предоставлен AbsoluteBlue здесь. Или вы можете использовать рекурсию. - person Patrick Parker; 01.12.2018

С помощью Commons.Lang вы можете просто использовать

ArrayUtils.reverse(int[] array)

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

person Manur    schedule 26.01.2010
comment
Я бы предпочел, чтобы он возвращал перевернутый (переданный) массив для функционального стиля. - person Laurent G; 02.10.2017
comment
@ laurent-g, чтобы быть справедливым: реверсирование массива таким образом более эффективно с точки зрения использования памяти, возможно, поэтому они сделали это таким образом. - person Sirmyself; 13.04.2018
comment
Моей точкой зрения было не копировать или не копировать. В моем сообщении указано (передано) для возврата (после обращения), поэтому его можно передать в выражении, не требующем отдельного оператора. - person Laurent G; 17.04.2018
comment
Что делать, если я не хочу использовать ArrayUtils? Как вы можете сделать это вручную? - person Edison Pebojot; 08.05.2021
comment
@LaurentG создайте вспомогательную функцию private int[] reversed(int[] array) {ArrayUtils.reverse(array);}, а затем вы сможете сделать f(reversed(arr)); :)) - person John D; 15.06.2021

Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse() может реверсировать java.util.Lists, а java.util.Arrays.asList() возвращает список, который обертывает определенный массив, который вы ему передаете, поэтому yourArray переворачивается после вызова Collections.reverse().

Стоимость составляет только создание одного List-объекта и никаких дополнительных библиотек не требуется.

Аналогичное решение было представлено в ответе Тарика и их комментаторов, но я думаю, что этот ответ будет более кратким и более понятным.

person escitalopram    schedule 08.04.2016
comment
Для массивов объектов это хорошее решение. Но это не работает для массивов примитивов. напр. передача int[] в asList(...) вернет не List<Integer>, а List<int[]>, содержащий один элемент. Не существует AFAICS простого встроенного способа преобразования int[] в Integer[]. - person Martin Rust; 22.09.2016
comment
Это не будет работать с примитивными массивами... коллекции не возвращают значение, поэтому теперь у вас есть бесполезный массив в виде списка в памяти. - person NightSkyCode; 23.10.2016
comment
@MartinRust Java 8+: Arrays.stream(arr).boxed().collect(Collectors.toList()) или Arrays.stream(arr).boxed().toArray(Integer[]::new) - person Simon Forsberg; 10.06.2020
comment
@SimonForsberg, это не слишком красиво... - person KingLogic; 07.07.2021
comment
@KingLogic Ну, это одна строчка и самая красивая вещь, которую я мог придумать. Не стесняйтесь предлагать что-то лучшее (не зависящее от библиотеки). - person Simon Forsberg; 07.07.2021

Я думаю, что следовать логике алгоритма немного проще, если вы объявите явные переменные для отслеживания индексов, которые вы меняете местами на каждой итерации цикла.

public static void reverse(int[] data) {
    for (int left = 0, right = data.length - 1; left < right; left++, right--) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left]  = data[right];
        data[right] = temp;
    }
}

Я также думаю, что более читабельно делать это в цикле while.

public static void reverse(int[] data) {
    int left = 0;
    int right = data.length - 1;

    while( left < right ) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left] = data[right];
        data[right] = temp;

        // move the left and right index pointers in toward the center
        left++;
        right--;
    }
}
person Bill the Lizard    schedule 19.08.2010
comment
старый школьный обмен выглядит более простым, но да, когда используются значения индекса массива слева, справа,... будет полезно для отладки, если таковые имеются - person Srinath Ganesh; 25.07.2014
comment
Вы также можете добавить «public static void swap (int [] data, int index1, int index2) {…}» и использовать его из «reverse» следующим образом: swap (data, left, right). - person pm_; 10.12.2015

Здесь уже есть много ответов, в основном посвященных изменению массива на месте. Но для полноты картины вот еще один подход, использующий потоки Java для сохранения исходного массива и создания нового перевернутого массива:

    int[] a = {8, 6, 7, 5, 3, 0, 9};
    int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
person Patrick Parker    schedule 13.02.2017

С гуавой:

Collections.reverse(Ints.asList(array));
person ZhekaKozlov    schedule 09.12.2016
comment
Это гениально! Коротко и эффективно. Как и все методы asList, он создает представление, которое выполняет запись непосредственно в резервный (примитивный) массив. Я думаю, что голосующий здесь ошибочно подумал, что это вернуло список в рамке или что-то в этом роде. - person Luke Usherwood; 29.12.2016
comment
@LukeUsherwood, предположительно, по-прежнему будут некоторые накладные расходы на упаковку и распаковку при вызове get и set для каждого элемента. Но я согласен с вами, что это блестящее решение. - person Patrick Parker; 13.02.2017
comment
Действительно, это стоит знать. Я не думаю, что это будет иметь большое значение для большей части кода, с которым я лично работаю — наши «горячие» области четко определены, остальное — своего рода «склеивающий код». В то же время я осознаю, что отток памяти также создает дополнительные скрытые затраты, которые профилировщики не приписывают фактической функции. - person Luke Usherwood; 13.02.2017
comment
@LukeUsherwood по-прежнему возвращает список в штучной упаковке вместо простого массива. - person AnthonyJClink; 01.10.2018
comment
@AnthonyJClink Не знаю, к чему это относится, но утилита JDK Collections.reverse является пустым методом. Это работает на месте во внутреннем классе Guava, который обертывает int[] (поскольку он никогда не хранит список упакованных Integer, я бы не назвал класс коробочным списком, а скорее представлением списка массива). Но да, он работает через интерфейс, передающий Integer объекта, так что, как уже упоминалось, это создаст много временных объектов и упаковки. Попробуйте IntStream или библиотеку примитивных коллекций, если производительность имеет значение. (Trove, Колобоке, коллекции Eclipse, ...) - person Luke Usherwood; 02.10.2018
comment
@LukeUsherwood согласно документации для Ints. : Методы Модификатор и тип Метод и описание static List‹Integer› asList(int... backingArray) Возвращает список фиксированного размера, поддерживаемый указанным массивом, подобно Arrays.asList(Object[]). Следовательно... это рамочный список. - person AnthonyJClink; 02.10.2018
comment
@AnthonyJClink хорошо, похоже, мы согласны с тем, как это работает. - person Luke Usherwood; 03.10.2018
comment
Что такое Ints ? - person Abhijit Sarkar; 22.04.2019
comment
Вы удобно предположили, что OP использует Guava. Java отстой в этом отношении, что нет библиотечных методов для работы с примитивными массивами, но это не значит, что люди переходят на использование другой библиотеки. Должно быть, я пропустил с гуавой: заявление об отказе от ответственности. - person Abhijit Sarkar; 22.04.2019

В случае Java 8 мы также можем использовать IntStream для обращения массива целых чисел следующим образом:

int[] sample = new int[]{1,2,3,4,5};
int size = sample.length;
int[] reverseSample = IntStream.range(0,size).map(i -> sample[size-i-1])
                      .toArray(); //Output: [5, 4, 3, 2, 1]
person akhil_mittal    schedule 15.10.2017

Простой цикл for!

for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
    int aux = array[start];
    array[start]=array[end];
    array[end]=aux;
}
person Apetrei Ionut    schedule 31.01.2015
comment
В будущем, пожалуйста, сообщайте спрашивающему конкретно, что он сделал неправильно, и что вы сделали правильно. - person Kartik Chugh; 05.02.2017
comment
изменить start <= end на start < end - person Leonard Pauli; 29.09.2018

Это поможет вам

int a[] = {1,2,3,4,5};
for (int k = 0; k < a.length/2; k++) {
    int temp = a[k];
    a[k] = a[a.length-(1+k)];
    a[a.length-(1+k)] = temp;
}
person Krishna Kumar Chourasiya    schedule 12.11.2013

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

Надеюсь, вы что-нибудь из этого почерпнете.

@Test
public void reverseTest(){
   Integer[] ints = { 1, 2, 3, 4 };
   Integer[] reversedInts = reverse(ints);

   assert ints[0].equals(reversedInts[3]);
   assert ints[1].equals(reversedInts[2]);
   assert ints[2].equals(reversedInts[1]);
   assert ints[3].equals(reversedInts[0]);

   reverseInPlace(reversedInts);
   assert ints[0].equals(reversedInts[0]);
}

@SuppressWarnings("unchecked")
private static <T> T[] reverse(T[] array) {
    if (array == null) {
        return (T[]) new ArrayList<T>().toArray();
    }
    List<T> copyOfArray = Arrays.asList(Arrays.copyOf(array, array.length));
    Collections.reverse(copyOfArray);
    return copyOfArray.toArray(array);
}

private static <T> T[] reverseInPlace(T[] array) {
    if(array == null) {
        // didn't want two unchecked suppressions
        return reverse(array);
    }

    Collections.reverse(Arrays.asList(array));
    return array;
}
person AnthonyJClink    schedule 03.04.2014
comment
Не решает исходную проблему с использованием примитивов. - person Melinda Green; 12.02.2015
comment
Есть много способов преобразовать простые числа в объекты. Я всегда рекомендую избегать примов везде, где это возможно в java, и я также считаю, что это следует поощрять. - person AnthonyJClink; 12.02.2015
comment
Преобразование массива примитивов неизвестной длины в массив может быть очень плохой идеей, особенно если делать это неосознанно. Java — это не Smalltalk. Примитивы являются частью языка и занимают свое место. Неважно, если они нам не нравятся, мы должны их принять и использовать там, где это уместно. - person Melinda Green; 13.02.2015
comment
На самом деле вам не нужно копировать массив, просто Collections.reverse(asList(arraytoReverse)); return arrayToReverse;. asList — это просто оболочка вокруг массива, поэтому исходный массив переворачивается. - person Radiodef; 12.06.2015

Если вы работаете с более примитивными данными (например, char, byte, int и т. д.), вы можете выполнить несколько забавных операций XOR.

public static void reverseArray4(int[] array) {
    int len = array.length;
    for (int i = 0; i < len/2; i++) {
        array[i] = array[i] ^ array[len - i  - 1];
        array[len - i  - 1] = array[i] ^ array[len - i  - 1];
        array[i] = array[i] ^ array[len - i  - 1];
    }
}
person AbsoluteBlue    schedule 13.09.2011

Ваша программа будет работать только для length = 0, 1. Можешь попробовать :

int i = 0, j = validData.length-1 ; 
while(i < j)
{
     swap(validData, i++, j--);  // code for swap not shown, but easy enough
}
person fastcodejava    schedule 26.01.2010
comment
Возможно, вы имели в виду подкачку как псевдокод для встроенной подкачки, а не вызов метода, но в противном случае это не сработает. Java передается по ссылке, поэтому невозможно написать метод подкачки для переменных. - person Dean Povey; 26.01.2010
comment
Я имел в виду любой способ, которым вы можете поменять местами v [i] и v [j]. Я знаю, как вызовы методов работают в java. Для метода вы можете сделать что-то вроде swap(v, i++, j--); - person fastcodejava; 26.01.2010
comment
Дин, массив validData — это объект, передаваемый по ссылке, поэтому метод swap() будет работать идеально. - person Gaël Oberson; 21.08.2015

Выше есть несколько отличных ответов, но я сделал это так:

public static int[] test(int[] arr) {

    int[] output = arr.clone();
    for (int i = arr.length - 1; i > -1; i--) {
        output[i] = arr[arr.length - i - 1];
    }
    return output;
}
person Ahmad Dalao    schedule 15.12.2019

Наиболее эффективно просто перебирать массив в обратном порядке.

Я не уверен, что решение Аарона делает это в этом вызове Collections.reverse(list); Кто-нибудь знает?

person Nick Strupat    schedule 26.01.2010
comment
Для повторения массива в обратном направлении требуется новый массив. Мне нравится решение, опубликованное выше, которое выполняет встроенное реверсирование без создания нового массива. - person mmcdole; 26.01.2010
comment
@Simucal зачем создавать новый массив? Просто повторите это в обратном порядке. - person Trejkaz; 22.10.2015

Разве это не будет гораздо более маловероятным для ошибок?

    int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] temp = new int[intArray.length];
    for(int i = intArray.length - 1; i > -1; i --){
            temp[intArray.length - i -1] = intArray[i];
    }
    intArray = temp;
person ModDL    schedule 04.08.2014

Решение с временной сложностью o(n) и пространственной сложностью o(1).

void reverse(int[] array) {
    int start = 0;
    int end = array.length - 1;
    while (start < end) {
        int temp = array[start];
        array[start] = array[end];
        array[end] = temp;
        start++;
        end--;
    }
}
person user11016    schedule 19.10.2017
comment
Просто к вашему сведению, это можно упростить до сложного цикла for: for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }. - person Tim Cooke; 25.10.2017

Есть два пути решения проблемы:

<сильный>1. Перевернуть массив в пространстве.

Шаг 1. Поменяйте местами элементы в начале и в конце индекса.

Шаг 2. Увеличьте начальный индекс, уменьшите конечный индекс.

Шаг 3. Повторяйте Шаг 1 и Шаг 2 до начального индекса ‹ конечного индекса

Для этого временная сложность будет O (n), а пространственная сложность будет O (1).

Пример кода для обращения массива в пространстве выглядит так:

public static int[] reverseAnArrayInSpace(int[] array) {
    int startIndex = 0;
    int endIndex = array.length - 1;
    while(startIndex < endIndex) {
        int temp = array[endIndex];
        array[endIndex] = array[startIndex];
        array[startIndex] = temp;
        startIndex++;
        endIndex--;
    }
    return array;
}

<сильный>2. Обратить массив с помощью вспомогательного массива.

Шаг 1. Создайте новый массив размера, равного заданному массиву.

Шаг 2. Вставить элементы в новый массив, начиная с начального индекса, из заданного массива, начиная с конечного индекса.

Для этого временная сложность будет O (n), а пространственная сложность будет O (n).

Пример кода для реверсирования массива с помощью вспомогательного массива выглядит так:

public static int[] reverseAnArrayWithAuxiliaryArray(int[] array) {
    int[] reversedArray = new int[array.length];
    for(int index = 0; index < array.length; index++) {
        reversedArray[index] = array[array.length - index -1]; 
    }
    return reversedArray;
}

Кроме того, для этого мы можем использовать Collections API из Java.

API коллекций внутренне использует тот же обратный подход в пространстве.

Пример кода для использования API коллекций выглядит так:

public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
    List<Integer> arrayList = Arrays.asList(array);
    Collections.reverse(arrayList);
    return arrayList.toArray(array);
}
person Karan Khanna    schedule 23.04.2018

2 способа инвертировать массив.

  1. Использование цикла For и замена элементов до середины с временной сложностью O (n/2).

    private static void reverseArray() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    for (int i = 0; i < array.length / 2; i++) {
        int temp = array[i];
        int index = array.length - i - 1;
        array[i] = array[index];
        array[index] = temp;
    }
    System.out.println(Arrays.toString(array));
    

    }

  2. Использование встроенной функции (Collections.reverse())

    private static void reverseArrayUsingBuiltInFun() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    Collections.reverse(Ints.asList(array));
    System.out.println(Arrays.toString(array));
    

    }

    Выход: [6, 5, 4, 3, 2, 1]

person Sameer Shrestha    schedule 18.05.2018
comment
Что такое Ints? - person CodingNow; 19.01.2019
comment
@CodingNow это один из вспомогательных классов утилиты Guava — см. здесь - person mrec; 05.06.2019

Ниже приведена полная программа для запуска на вашем компьютере.

public class ReverseArray {
    public static void main(String[] args) {
        int arr[] = new int[] { 10,20,30,50,70 };
        System.out.println("reversing an array:");
        for(int i = 0; i < arr.length / 2; i++){
            int temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }   
    }
}

Для программ на матрицах с использованием массивов это будет хороший источник.Перейти по ссылке.

person Mdhar9e    schedule 14.08.2014

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

for(int i = 0; i < validData.length; i++){
    validData[i] = validData[i] ^ validData[validData.length - i - 1];
    validData[validData.length - i - 1] = validData[i] ^ validData[validData.length - i - 1];
    validData[i] = validData[i] ^ validData[validData.length - i - 1];
}

Смотрите эту ссылку для лучшего объяснения:

http://betterexplained.com/articles/swap-two-variables-using-xor/

person vikarjramun    schedule 27.12.2014

Вот простая реализация для реверсирования массива любого типа, а также полная/частичная поддержка.

import java.util.logging.Logger;

public final class ArrayReverser {
 private static final Logger LOGGER = Logger.getLogger(ArrayReverser.class.getName());

 private ArrayReverser () {

 }

 public static <T> void reverse(T[] seed) {
    reverse(seed, 0, seed.length);
 }

 public static <T> void reverse(T[] seed, int startIndexInclusive, int endIndexExclusive) {
    if (seed == null || seed.length == 0) {
        LOGGER.warning("Nothing to rotate");
    }
    int start = startIndexInclusive < 0 ? 0 : startIndexInclusive;
    int end = Math.min(seed.length, endIndexExclusive) - 1;
    while (start < end) {
        swap(seed, start, end);
        start++;
        end--;
    }
}

 private static <T> void swap(T[] seed, int start, int end) {
    T temp =  seed[start];
    seed[start] = seed[end];
    seed[end] = temp;
 }  

}

Вот соответствующий модульный тест

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Before;
import org.junit.Test;

public class ArrayReverserTest {
private Integer[] seed;

@Before
public void doBeforeEachTestCase() {
    this.seed = new Integer[]{1,2,3,4,5,6,7,8};
}

@Test
public void wholeArrayReverse() {
    ArrayReverser.<Integer>reverse(seed);
    assertThat(seed[0], is(8));
}

 @Test
 public void partialArrayReverse() {
    ArrayReverser.<Integer>reverse(seed, 1, 5);
    assertThat(seed[1], is(5));
 }
}
person craftsmannadeem    schedule 29.01.2016

Вот что я придумал:

// solution 1 - boiler plated 
Integer[] original = {100, 200, 300, 400};
Integer[] reverse = new Integer[original.length];

int lastIdx = original.length -1;
int startIdx = 0;

for (int endIdx = lastIdx; endIdx >= 0; endIdx--, startIdx++)
   reverse[startIdx] = original[endIdx];

System.out.printf("reverse form: %s", Arrays.toString(reverse));

// solution 2 - abstracted 
// convert to list then use Collections static reverse()
List<Integer> l = Arrays.asList(original);
Collections.reverse(l);
System.out.printf("reverse form: %s", l);
person Simple-Solution    schedule 16.02.2017

введите здесь описание изображения

кусок торта. я сделал это для строки, но это не сильно отличается

person Nasib    schedule 13.02.2020

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

int[] a = {1,2,3,4,5,6,7,23,9}, b; //compound declaration
var j = a.length;
b = new int[j];
for (var i : a)
    b[--j] = i; //--j so you don't have to subtract 1 from j. Otherwise you would get ArrayIndexOutOfBoundsException;
System.out.println(Arrays.toString(b));

Конечно, если вам действительно нужно, чтобы a был обратным массивом, просто используйте

a = b; //after the loop
person Bwizz    schedule 30.07.2020

Вот сжатая версия:

Мое решение создает новый массив в обратном порядке. С каждой итерацией i цикл for вставляет последний индекс [array.length - 1] в текущий индекс [i]. Затем продолжает тот же процесс, вычитая массив текущей итерации [(array.length - 1) - i] из последнего индекса и вставка элемента в следующий индекс обратного массива!

private static void reverse(int[] array) {
    int[] reversed = new int[array.length];

    for (int i = 0; i < array.length; i++) {
        reversed[i] = array[(array.length - 1) - i];
    }
    System.out.println(Arrays.toString(reversed));
}
person James Guest    schedule 24.09.2020

Просто ради этого. Людям часто требуется только «представление» массива или списка в обратном порядке, а не полностью не нужен обратный массив при работе с потоками и коллекциями, а «обратное» представление исходного массива/коллекции. , лучше всего создать инструментарий, имеющий обратный вид на список/массив.

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

/// Reverse Iterator
public class ReverseIterator<T> implements Iterator<T> {
  private int index;
  private final List<T> list;
  public ReverseIterator(List<T> list) {
     this.list = list;
     this.index = list.size() - 1;
  }
  public boolean hasNext() {
    return index >= 0 ? true : false;
  }
  public T next() {
    if(index >= 0) 
      return list.get(index--);
    else 
      throw new NoSuchElementException();
  }
}

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

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

person Martin Kersten    schedule 29.09.2020

Это имеет 2 решения

  1. Петля

  2. Рекурсия

    открытый класс

     public static void main(String[] args) {
         int array[] = {2, 3, 1, 4, 9};
         //reverseArray(array, 0, array.length - 1);
         reverseArrayWhileLoop(array, 0, array.length - 1);
         printArray(array);
     }
    
     private static void printArray(int[] array) {
         for (int a : array) {
             System.out.println(a);
         }
     }
    
     private static void reverseArray(int[] array, int start, int end) {
         if (start > end) {
             return;
         } else {
             int temp;
             temp = array[start];
             array[start] = array[end];
             array[end] = temp;
             reverseArray(array, start + 1, end - 1);
         }
     }
    
     private static void reverseArrayWhileLoop(int[] array, int start, int end) {
         while (start < end) {
             int temp;
             temp = array[start];
             array[start] = array[end];
             array[end] = temp;
             start++;
             end--;
         }
     }
    
    ReverseArray {

     public static void main(String[] args) {
         int array[] = {2, 3, 1, 4, 9};
         //reverseArray(array, 0, array.length - 1);
         reverseArrayWhileLoop(array, 0, array.length - 1);
         printArray(array);
     }
    
     private static void printArray(int[] array) {
         for (int a : array) {
             System.out.println(a);
         }
     }
    
     private static void reverseArray(int[] array, int start, int end) {
         if (start > end) {
             return;
         } else {
             int temp;
             temp = array[start];
             array[start] = array[end];
             array[end] = temp;
             reverseArray(array, start + 1, end - 1);
         }
     }
    
     private static void reverseArrayWhileLoop(int[] array, int start, int end) {
         while (start < end) {
             int temp;
             temp = array[start];
             array[start] = array[end];
             array[end] = temp;
             start++;
             end--;
         }
     }
    

    }

person Aalishan Ansari    schedule 03.04.2021

Реализация с использованием дженериков.

    //Reverse and get new Array -preferred
    public static final <T> T[] reverse(final T[] array) {
        final int len = array.length;
        final T[] reverse = (T[]) Array.newInstance(array.getClass().getComponentType(), len);
        for (int i = 0; i < len; i++) {
            reverse[i] = array[len-(i+1)];
        }
        return reverse;
    }
    
    //Reverse existing array - don't have to return it
    public static final <T> T[] reverseExisting(final T[] array) {
        final int len = array.length;
        for (int i = 0; i < len/2; i++) {
            final T temp = array[i];
            array[i] = array[len-(i+1)];
            array[len-(i+1)] = temp;
        }
        return array;
    }
person krishna Telgave    schedule 20.06.2021

Попробуйте эту программу в JAVA: -

import java.util.Scanner;

public class Rev_one_D {

    static int row;

    static int[] trans_arr = new int[row];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        row = n;

        int[] arr = new int[row];
        for (int i = 0; i < row; i++) {

            arr[i] = sc.nextInt();
            System.out.print(arr[i] + " ");

            System.out.println();
        }

        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;

        }

        for (int i = 0; i < row; i++) {
            System.out.print(arr[i] + " ");
            System.out.println();
        }
    }
}
person Nikhil Kumar    schedule 20.04.2015

Попробуйте этот код:

    int arr[] = new int[]{1,2,3,4,5,6,7};
    for(int i=0;i<arr.length/2;i++){
        int temp = arr[i];
        arr[i] = arr[(arr.length-1)-i];
        arr[(arr.length-1)-i] = temp;
     }
     System.out.println(Arrays.toString(arr));
person Soumya Sarkar    schedule 30.11.2015

Вот простое быстрое решение. Надеюсь, поможет!.

public int[] reverse(int[] arr) {
    for(int i = arr.length; i > 0 ; i--){
        System.out.print(arr[i-1] + " ");
    }
    return arr;
}
person HenryDev    schedule 13.01.2016
comment
Он не вернет массив в обратном порядке! - person InziKhan; 08.06.2018

Другой способ реверсирования массива

public static int []reversing(int[] array){
    int arraysize = array.length;
    int[] reverse = new int [arraysize+1];
    for(int i=1; i <= arraysize ; i++){
        int dec= arraysize -i;
        reverse[i] = array[dec];
    }
    return reverse;
}
person marela    schedule 13.08.2016

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

List<Integer> normalArray= new ArrayList<>();
List<Integer> reversedArray = new ArrayList<>();

// Fill up array here

for (int i = 1; i <= normalArray.size(); i++) {
  reversedArray .add(normalArray.get(normalArray.size()-i));
}

Таким образом, в основном перебираем исходный массив и добавляем все значения в обратном порядке в новый (обратный) массив. Тип списка может быть любым. Я прорабатываю этот код несколько раз, из-за этого некоторые другие решения не работают.

person Mathieu Brouwers    schedule 13.01.2017
comment
это не массив - person Patrick Parker; 13.02.2017

Вы можете использовать это

public final class ReverseComparator<T extends Comparable<T>> implements  Comparator<T> {
  @Override
  public int compare(T o1, T o2) {      
    return o2.compareTo(o1);
  }
}

просто

Integer[] a = {1,6,23,4,6,8,2}
Arrays.sort(a, new ReverseComparator<Integer>());
person FrederikH    schedule 24.09.2015
comment
Еще более простой код из java 1.7+ 'code' Integer[] a = new Integer[]{1,6,23,4,6,8,2} Arrays.sort(a, java.util.Collections.reverseOrder()) ; - person FrederikH; 24.09.2015

person    schedule
comment
Конечно, будет. Список может содержать только объекты, а не примитивы, поэтому все примитивы (в данном случае ints) помещаются в соответствующие оболочки (в данном случае Integers) и помещаются в список. Видите ли, Integer — это объекты. @Том - person 11684; 03.12.2012
comment
Осторожно: если я не ошибаюсь, исходный массив изменен. Чтобы было ясно, вы можете просто ничего не возвращать. - person Andrea Zilio; 05.02.2013
comment
как бы вы преобразовали массив Object[], который он возвращает, обратно в массив int[]??? ОП задал вопрос о массиве целых чисел, поэтому не могли бы вы дать код, который работает для массива целых чисел из коробки? Спасибо. - person vincent mathew; 20.05.2013
comment
Не важно! Важно то, что нет циклов, нет зависимостей. Поэтому лучший ответ. - person filip; 03.08.2014
comment
@ 11684 Да, общие списки могут содержать только объекты. Но метод исключает массив. Массивы могут содержать примитивы. Поэтому int[] отличается от Integer[]. Попробуйте: Integer[] array = new int[5]. Вы получите ошибку компиляции. Вот почему класс Java Arrays определяет множество методов для работы с примитивными массивами. Попытка передать int[] вышеуказанному методу приведет к чему-то вроде The method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[]). @Filip - алгоритм на месте использует меньше памяти и работает быстрее. - person Brian McCutchon; 18.10.2014
comment
@ Андреа На самом деле это не так. Список, возвращаемый Arrays.asList(), не ссылается ни на исходный массив, ни на возвращаемый массив. Это одна из проблем этого метода: он использует втрое больше памяти и в три раза больше работы, чем алгоритм на месте. - person Brian McCutchon; 18.10.2014
comment
Похоже, я ошибся насчет Arrays.asList(): на самом деле он ссылается на исходный массив. Таким образом, это использует только вдвое больше памяти и выполняет вдвое больше работы (поскольку List.toArray генерирует совершенно новый массив). Хороший нелокальный алгоритм по-прежнему будет использовать в два раза больше памяти, но выполнять тот же объем работы, что и оперативный метод. @Андреа Ты прав. Похоже, Collections.reverse(Arrays.asList(array)) — это допустимый способ реверсирования массива. К сожалению, это не работает для примитивов. - person Brian McCutchon; 18.10.2014
comment
Сам по себе этот метод может работать, но просто нельзя передать int[] в качестве аргумента этому методу (несовместимые типы: int[] нельзя преобразовать в Object[]). - person MC Emperor; 17.11.2017
comment
Для целых чисел: public static Object[] reverse(Integer[] arr) { List‹Integer› list = Arrays.asList(arr); Collections.reverse(список); вернуть список.toArray(); в вашем основном: (пример) Integer[] numbers= {1,2,8,3}; Объект[]число=(Целое число[]) реверс(числа); - person Rim; 19.11.2018

person    schedule
comment
К сожалению, это самый чистый ответ, доступный здесь, потому что каждый разработчик знает, как это сделать, и он не требует установки каких-либо расширенных пакетов. - person HoldOffHunger; 16.06.2017
comment
Это хорошо для получения значений массива, но если вы действительно хотите перевернуть массив, вам придется создать новый, используя этот метод => другие будут более эффективными. - person Cactusroot; 24.05.2021

person    schedule
comment
да, я пробовал тот же и чистый код вместе с выводом: int[] a = {1,3,5,2,6,7}; for(int i = a.length-1;i›=0;i--) {System.out.print(a[i]+);}` перевернет массив с последнего индекса на первый индекс - person Rocket_03; 22.08.2018

person    schedule
comment
Пожалуйста, рассмотрите возможность добавления объяснения к вашему ответу. Ответы только на код ничего не объясняют. - person rgettman; 09.12.2014

person    schedule
comment
Пожалуйста, рассмотрите возможность добавления объяснения к вашему ответу. Ответы только на код ничего не объясняют. – - person Nikhil Kumar; 20.04.2015
comment
На самом деле это не переворачивает массив. - person Radiodef; 14.06.2015

person    schedule
comment
Он не будет переворачивать текущий массив, он будет печатать массив только в обратном направлении. - person Abhishekkumar; 20.01.2017
comment
@Abhishekkumar, он даже этого не сделает (i > 0). - person ChiefTwoPencils; 04.02.2017