¿Cómo invierto una matriz int en Java?
Estoy intentando revertir una matriz int en Java.
Este método no invierte la matriz.
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;
}
¿Qué tiene de malo?
Para invertir una matriz int, intercambia elementos hasta llegar al punto medio, así:
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;
}
De la forma en que lo hace, intercambia cada elemento dos veces, por lo que el resultado es el mismo que el de la lista inicial.
Con Commons.Lang , simplemente puedes usar
ArrayUtils.reverse(int[] array)
La mayoría de las veces, es más rápido y seguro contra errores seguir con bibliotecas fácilmente disponibles que ya han sido probadas por unidades y por usuarios cuando solucionan su problema.
Collections.reverse(Arrays.asList(yourArray));
java.util.Collections.reverse()
puede invertir java.util.List
s y java.util.Arrays.asList()
devuelve una lista que envuelve la matriz específica que le pasa, por lo tanto, yourArray
se invierte después de la invocación de Collections.reverse()
.
El costo es solo la creación de un objeto de lista y no se requieren bibliotecas adicionales.
Se presentó una solución similar en la respuesta de Tarik y sus comentaristas, pero creo que esta respuesta sería más concisa y más fácilmente analizable.
public class ArrayHandle {
public static Object[] reverse(Object[] arr) {
List<Object> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray();
}
}
Creo que es un poco más fácil seguir la lógica del algoritmo si declaras variables explícitas para realizar un seguimiento de los índices que intercambias en cada iteración del ciclo.
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;
}
}
También creo que es más legible hacer esto en un bucle 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--;
}
}