¿Cómo invierto una matriz int en Java?

Resuelto MichaelScott asked hace 14 años • 48 respuestas

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?

MichaelScott avatar Jan 26 '10 13:01 MichaelScott
Aceptado

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.

3lectrologos avatar Jan 26 '2010 06:01 3lectrologos

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.

Manur avatar Jan 26 '2010 07:01 Manur
Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()puede invertir java.util.Lists y java.util.Arrays.asList()devuelve una lista que envuelve la matriz específica que le pasa, por lo tanto, yourArrayse 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.

escitalopram avatar Apr 08 '2016 08:04 escitalopram
public class ArrayHandle {
    public static Object[] reverse(Object[] arr) {
        List<Object> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray();
    }
}
Tarik avatar Jan 26 '2010 06:01 Tarik

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--;
    }
}
Bill the Lizard avatar Aug 19 '2010 14:08 Bill the Lizard