Estoy tratando de 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?
Respuestas:
Para invertir una matriz int, intercambia elementos hacia arriba hasta llegar al punto medio, de esta manera:
De la forma en que lo hace, intercambia cada elemento dos veces, por lo que el resultado es el mismo que la lista inicial.
fuente
validData.length / 2
parte al exterior del ciclo for.validData.length >> 1
. Eso es equivalente y más rápido, pero confunde a muchos programadores y cualquier buen compilador lo hará automáticamente.validData.length - i - 1
y guardarlo en una variable.Con Commons.Lang , simplemente podría usar
La mayoría de las veces, es más rápido y más seguro a prueba de errores apegarse a bibliotecas fácilmente disponibles que ya han sido probadas por la unidad y probadas por el usuario cuando se ocupan de su problema.
fuente
fuente
int
s en este caso) se envuelven en sus respectivos contenedores (Integer
s en este caso) y se colocan en la lista. Ya ves, losInteger
s son objetos. @Tomint[]
lo tanto, es diferente deInteger[]
. Inténtelo:Integer[] array = new int[5]
. Obtendrás un error de compilación. Es por eso que laArrays
clase Java define un montón de métodos para trabajar con matrices primitivas. Intentar pasar unint[]
método anterior dará como resultado algo asíThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip: un algoritmo in situ utiliza menos memoria y se ejecuta más rápido.Arrays.asList()
no hace referencia a la matriz original, ni la matriz devuelta. Ese es uno de los problemas con este método: utiliza el triple de memoria y triplica el trabajo como un algoritmo in situ.int[]
argumento a este método ( "tipos incompatibles: int [] no se puede convertir en Object []" ).java.util.Collections.reverse()
puede invertirjava.util.List
syjava.util.Arrays.asList()
devuelve una lista que envuelve la matriz específica que le pasa, poryourArray
lo tanto, se invierte después de la invocación deCollections.reverse()
.El costo es solo la creación de un objeto List y no se requieren bibliotecas adicionales.
Se ha presentado 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ácil de analizar.
fuente
int[]
aasList(...)
no devolverá unList<Integer>
, sino unList<int[]>
, que contiene un elemento. Hay AFAICS no hay una forma simple incorporada para convertir unaint[]
a unaInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
oArrays.stream(arr).boxed().toArray(Integer[]::new)
Creo que es un poco más fácil seguir la lógica del algoritmo si declara variables explícitas para realizar un seguimiento de los índices que está intercambiando en cada iteración del bucle.
También creo que es más legible hacer esto en un ciclo while.
fuente
Aquí ya hay muchas respuestas, principalmente enfocadas en modificar la matriz en el lugar. Pero en aras de la exhaustividad, aquí hay otro enfoque que utiliza secuencias de Java para preservar la matriz original y crear una nueva matriz inversa:
fuente
Con guayaba:
fuente
asList
métodos, crea una vista que escribe directamente en la matriz de respaldo (primitiva). Creo que el votante negativo pensó erróneamente que esto devolvió una lista en caja o algo así.Collections.reverse
es un método nulo. Esto opera en el lugar en una clase interna de Guava que envuelve unint[]
(ya que nunca almacena una lista de cuadros en cajaInteger
, no llamaría a la clase una "lista en caja", sino más bien una "Vista de lista de una matriz"). Pero sí, funciona a través de una interfaz que pasaInteger
objetos, por lo que esto crearía una gran cantidad de abandono de objetos temporales y boxeo como se mencionó. Pruebe unaIntStream
o una biblioteca de colecciones primitivas donde el rendimiento es importante. (Trove, Koloboke, Eclipse Collections, ...)En el caso de Java 8 , también podemos utilizar
IntStream
para invertir la matriz de enteros como:fuente
Simple para loop!
fuente
start <= end
astart < end
Esto te ayudara
fuente
fuente
Así es como lo resolvería personalmente. La razón detrás de la creación del método parametrizado es permitir que se ordene cualquier matriz ... no solo sus enteros.
Espero que obtengas algo de eso.
fuente
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
es solo un contenedor alrededor de la matriz, por lo que la matriz original se invierte.Su programa solo funcionará
length = 0, 1
. Puedes probar :fuente
Si trabaja con datos que son más primitivos (es decir, char, byte, int, etc.), puede realizar algunas divertidas operaciones XOR.
fuente
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Es más eficiente simplemente iterar la matriz hacia atrás.
No estoy seguro de si la solución de Aaron hace esto vi esta llamada
Collections.reverse(list);
¿Alguien sabe?fuente
fuente
fuente
¿No sería así mucho más improbable que se cometieran errores?
fuente
Solución con o (n) complejidad de tiempo y o (1) complejidad de espacio.
fuente
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 formas de revertir una matriz.
Usando el bucle For e intercambia los elementos hasta el punto medio con una complejidad temporal de O (n / 2).
}
Uso de la función integrada (Collections.reverse ())
}
Salida: [6, 5, 4, 3, 2, 1]
fuente
Ints
?fuente
Hay algunas respuestas excelentes arriba, pero así es como lo hice:
fuente
a continuación se muestra el programa completo para ejecutar en su máquina.
Para los programas en matriz que usan matrices, esta será la buena fuente Vaya a través del enlace.
fuente
Usando la solución XOR para evitar la variable temporal, su código debería verse como
Vea este enlace para una mejor explicación:
http://betterexplained.com/articles/swap-two-variables-using-xor/
fuente
fuente
Aquí hay una implementación simple, para invertir la matriz de cualquier tipo , más soporte completo / parcial .
Aquí está la prueba de unidad correspondiente
fuente
Esto es lo que se me ocurrió:
fuente
Hay dos formas de tener una solución para el problema:
1. Invierta una matriz en el espacio.
Paso 1. Intercambie los elementos al inicio y al final del índice.
Paso 2. Incremente el índice inicial disminuya el índice final.
Paso 3. Itere el Paso 1 y el Paso 2 hasta el índice inicial <índice final
Para esto, la complejidad del tiempo será O (n) y la complejidad del espacio será O (1)
El código de muestra para invertir una matriz en el espacio es como:
2. Invierta una matriz utilizando una matriz auxiliar.
Paso 1. Cree una nueva matriz de tamaño igual a la matriz dada.
Paso 2. Inserte elementos en la nueva matriz comenzando desde el índice inicial, desde la matriz dada comenzando desde el índice final.
Para esto, la complejidad temporal será O (n) y la complejidad espacial será O (n)
El código de muestra para invertir una matriz con matriz auxiliar es como:
Además, podemos usar la API de colecciones de Java para hacer esto.
La API de colecciones usa internamente el mismo enfoque inverso en el espacio.
El código de muestra para usar la API de colecciones es como:
fuente
fuente
fuente