如何在Java中反转int数组?

我想在Java中反转一个int数组。

此方法不会颠倒数组。

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) 

大多数情况下,使用易于使用的库已经进行了unit testing和用户testing,可以更快速,更安全地保护错误。

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

我认为如果你声明显式variables来跟踪在循环的每次迭代中交换的索引,那么遵循algorithm的逻辑就容易一些。

 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()返回一个列表,该列表包装了传递给它的特定数组,因此在调用Collections.reverse()之后, yourArray被反转Collections.reverse()

成本只是创build一个List对象,不需要额外的库。

Tarik及其评论者的回答中也提出了类似的解决scheme,但我认为这个答案会更简洁,更易于parsing。

这将帮助你

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

这是我个人如何解决这个问题。 创build参数化方法的原因是允许任何数组sorting…不只是你的整数。

我希望你从中得到一些东西。

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

番石榴:

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

这里已经有很多答案,主要集中在修改arrays。 但为了完整起见,下面是使用Javastream来保存原始数组并创build一个新的反向数组的另一种方法:

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

简单地向后迭代数组是最有效的。

我不确定Aaron的解决scheme是否会调用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]); } } 

这是一个简单的快速解决scheme。 希望它有帮助!

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

不这样做是不是更不可能的错误?

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

对于matrix使用数组的程序, 这将是很好的来源 。通过链接。

使用XOR解决scheme来避免tempvariables,你的代码应该看起来像

 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<array.length; ++i) System.out.print(array[i] + " "); } public static void reverse (int [] array){ for(int start=0, end=array.length-1; start<=end; start++, end--){ int aux = array[start]; array[start]=array[end]; array[end]=aux; } } } 
 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<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)); 

这里是一个简单的实现,以反转任何types的数组,加上全部/部分支持。

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

这是相应的unit testing

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

另一种反转数组的方法

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

由于我打算保留原来的arrays,所以我用以下方式解决了这个问题:

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

所以基本上循环通过初始数组,并以相反的顺序将所有的值添加到新的(反向)数组。 列表的types可以是任何东西。 我多次通过此代码工作,导致其他一些解决scheme无法工作。

这是我所想到的:

 // 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); 

在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] 

具有o(n)时间复杂度和o(1)空间复杂度的解决scheme。

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