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