Reverse an Array
Reversing an array. I can’t really remember the last time I needed to do this, but one thing is for sure, if I did, I didn’t write an ad hoc piece of code to do this: I probably used an ArrayList to do the trick, or some third-party library. But for the sake of education, let’s have a quick look at different solutions.
The Classic way
This method is a classic of algorithm classes: use a temporary value to swap two indexes in the array:
public class NumberReversal {
public static void reverseArray(int[] array) { if (array == null) { return; } int i = 0; int j = array.length - 1; int tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } }
public static void main(String[] args) { int[] test = { 1, 2, 3, 4 }; reverseArray(test); for (int i : test) { System.out.println(i); } } }
Recursion
Recursions make CS teachers happy, so here is a solution that uses one. I personally find it hard to read, and recursions, despite being teachers’ pet, are usually frowned upon in real life. It relies on 2 key methods: System.arraycopy, which copies an array into another, and Arrays.copyOfRange. The 2 methods do pretty much the same thing, except Arrays.copyOfRange does some bond checking… and uses System.arraycopy. I used them both so that you are aware of them.
import java.util.Arrays;
public class NumberReversal {
static int[] concat(int[] a, int[] b ) { int[] c = new int[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; }
public static int[] reverseArray(int[] array) { if (array.length == 0) { return new int[] {}; } else if (array.length == 1) { return array; } else { // recursion: concatenate the reverse of the end of the array // to the first element (put at the end) return concat( reverseArray(Arrays.copyOfRange(array, 1, array.length)), new int[] { array[0] } ); } }
public static void main(String[] args) { int[] test = {1, 2, 3, 4}; int[] reversed = reverseArray(test); for (int i: reversed) { System.out.println(i); } } }
Using Collections
This solution forces you to deal with the int[] to Integer[] conversion, which is a bit of a pain. So this solution actually cheats by only using Integer objects. But if you wanted to use int[], you would have to do the conversion either “manually”, or using Apache common lang’s ArrayUtils.toPrimitive and ArrayUtils.toObject…
import java.util.Arrays; import java.util.Collections; import java.util.List;
public class NumberReversal {
public static void reverseArray(Integer[] array) { List list = Arrays.asList(array); Collections.reverse(list);
array = (Integer[])list.toArray(new Integer[array.length]); }
public static void main(String[] args) { Integer[] test = { 1, 2, 3, 4 }; reverseArray(test); for (int i : test) { System.out.println(i); } } }
The Sensible Solution
This one uses the Apache commons lang library which, a few days ago I was mentioning as one of my favourite libs.
import org.apache.commons.lang.ArrayUtils;
public class NumberReversal { public static void main(String[] args) { int[] test = {1, 2, 3, 4}; ArrayUtils.reverse(test); for (int i: test) { System.out.println(i); } } }