Как изменить массив 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; } 

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

Чтобы отменить массив 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; } 

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

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

 ArrayUtils.reverse(int[] array) 

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

 public class ArrayHandle { public static Object[] reverse(Object[] arr) { List list = Arrays.asList(arr); Collections.reverse(list); return list.toArray(); } } 

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

 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--; } } 
 Collections.reverse(Arrays.asList(yourArray)); 

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

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

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

С Гуавой:

 Collections.reverse(Ints.asList(array)); 

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

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

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

 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; } 

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

 for (int start = 0, end = array.length - 1; start <= end; start++, end--) { int aux = array[start]; array[start]=array[end]; array[end]=aux; } 

Если вы работаете с более примитивными данными (т. Е. 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]; } } 

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

Надеюсь, вы что-то извлекли из этого.

 @Test public void reverseTest(){ Integer[] ints = {1, 2, 3, 4}; Integer[] reversedInts = reverse(ints); assertEquals(Integer.valueOf(1), reversedInts[3]); assertEquals(Integer.valueOf(4), reversedInts[0]); } public static  T[] reverse(T[] arrayToReverse){ //as per the collections spec (and pointed out by @Radiodef) // the collections api will sort the array in place. Collections.reverse(Arrays.asList(arrayToReverse)); return arrayToReverse; } 
 for(int i=validData.length-1; i>=0; i--){ System.out.println(validData[i]); } 

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

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

Ваша программа будет работать только для 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 } 
 public void display(){ String x[]=new String [5]; for(int i = 4 ; i > = 0 ; i-- ){//runs backwards //i is the nums running backwards therefore its printing from //highest element to the lowest(ie the back of the array to the front) as i decrements System.out.println(x[i]); } } 

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

 public int[] reverse(int[] arr) { for(int i = arr.length; i > 0 ; i--){ System.out.print(arr[i-1] + " "); } return arr; } 
 public void getDSCSort(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; } } 

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

 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] 
 static int[] reverseArray(int[] a) { int ret[] = new int[a.length]; for(int i=0, j=a.length-1; i=0; i++, j--) ret[i] = a[j]; return ret; } 

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

  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; 

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

 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]); } } } 

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

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

 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/

 public class TryReverse { public static void main(String[] args) { int [] array = {2,3,4,5,6,7,8,9}; reverse(array); for(int i=0; i 
 private static int[] reverse(int[] array){ int[] reversedArray = new int[array.length]; for(int i = 0; i < array.length; i++){ reversedArray[i] = array[array.length - i - 1]; } return reversedArray; } 

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

  int arr[] = new int[]{1,2,3,4,5,6,7}; for(int i=0;i 

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

 import java.util.logging.Logger; public final class ArrayReverser { private static final Logger LOGGER = Logger.getLogger(ArrayReverser.class.getName()); private ArrayReverser () { } public static  void reverse(T[] seed) { reverse(seed, 0, seed.length); } public static  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  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.reverse(seed); assertThat(seed[0], is(8)); } @Test public void partialArrayReverse() { ArrayReverser.reverse(seed, 1, 5); assertThat(seed[1], is(5)); } } 

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

 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; } 

Это работает, если вы хотите повернуть вспять, пока не дойдете до середины массива?

  double [] list = {11,21,31,41,51,61,71,81,91}; int midpoint = list.length/2 -1; int firstVal = 0; while(firstVal < midpoint){ double midPoint = list[midpoint]; double firstValue = list[firstVal]; list[midpoint] = firstValue; list[firstVal] = midPoint; firstVal = firstVal + 1; midpoint = midpoint-1; } StdOut.println(Arrays.toString(list)); } 

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

 List normalArray= new ArrayList<>(); List reversedArray = new ArrayList<>(); // Fill up array here for (int i = 1; i <= normalArray.size(); i++) { reversedArray .add(normalArray.get(normalArray.size()-i)); } 

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

Решение с 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--; } } 
  • Как объявить 2d-массив в C ++ с помощью new?
  • Разбить строку и поместить ее в массив int
  • c ++ array - выражение должно иметь постоянное значение
  • Работа с ArrayStoreException
  • Массивы переменной длины (динамические) в Java
  • В чем преимущество linspace над двоеточием: «оператор?
  • Теперь, когда у нас есть std :: array, какие применения остаются для массивов в стиле C?
  • Не все отображаемые свойства
  • Доступ к массиву за пределами границ не дает ошибки, почему?
  • Разница между массивом int и массивом int
  • Сравнение массивов в утверждениях JUnit, сжатый встроенный способ?
  • Давайте будем гением компьютера.