Java, desplazamiento de elementos en una matriz

Tengo una matriz de objetos en Java, y estoy tratando de llevar un elemento a la cima y desplazar el rest hacia abajo en uno.

Supongamos que tengo una matriz de tamaño 10, y estoy tratando de extraer el quinto elemento. El quinto elemento va a la posición 0 y todos los elementos del 0 al 5 se desplazarán hacia abajo en uno.

Este algoritmo no cambia correctamente los elementos:

 Object temp = pool[position]; for (int i = 0; i < position; i++) { array[i+1] = array[i]; } array[0] = temp; 

¿Cómo lo hago correctamente?

Suponiendo que su matriz es {10,20,30,40,50,60,70,80,90,100}

Lo que hace tu loop es:

Iteración 1: matriz [1] = matriz [0]; {10,10,30,40,50,60,70,80,90,100}

Iteración 2: matriz [2] = matriz [1]; {10,10,10,40,50,60,70,80,90,100}

Lo que deberías estar haciendo es

 Object temp = pool[position]; for (int i = (position - 1); i >= 0; i--) { array[i+1] = array[i]; } array[0] = temp; 

Lógicamente, no funciona y debes invertir tu ciclo:

 for (int i = position-1; i >= 0; i--) { array[i+1] = array[i]; } 

Alternativamente puedes usar

 System.arraycopy(array, 0, array, 1, position); 

Solo puede usar Collections.rotate(List list, int distance)

Utilice Arrays.asList(array) para convertir a List

más información en: https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate(java.util.List,%20int)

La manipulación de matrices de esta manera es propensa a errores, como ha descubierto. Una mejor opción puede ser utilizar LinkedList en su situación. Con una lista enlazada y todas las colecciones de Java, la administración de arreglos se maneja internamente para que no tenga que preocuparse de mover los elementos. Con una LinkedList, solo debe llamar a remove y luego addLast y listo.

Solo para completar: solución de Stream desde Java 8.

 final String[] shiftedArray = Arrays.stream(array) .skip(1) .toArray(String[]::new); 

Yo pensaría que si me quedara con System.arraycopy() . Pero la mejor solución a largo plazo podría ser convertir todo en Colecciones Inmutables ( Guava , Vavr ), si son de corta duración.

Prueba esto:

 Object temp = pool[position]; for (int i = position-1; i >= 0; i--) { array[i+1] = array[i]; } array[0] = temp; 

Mire aquí para verlo funcionando: http://www.ideone.com/5JfAg

En la primera iteración de su ciclo, sobrescribe el valor en el array[1] . Debería ir a través de las indicaciones en el orden inverso.

 static void pushZerosToEnd(int arr[]) { int n = arr.length; int count = 0; // Count of non-zero elements // Traverse the array. If element encountered is non-zero, then // replace the element at index 'count' with this element for (int i = 0; i < n; i++){ if (arr[i] != 0)`enter code here` // arr[count++] = arr[i]; // here count is incremented swapNumbers(arr,count++,i); } for (int j = 0; j < n; j++){ System.out.print(arr[j]+","); } } public static void swapNumbers(int [] arr, int pos1, int pos2){ int temp = arr[pos2]; arr[pos2] = arr[pos1]; arr[pos1] = temp; } 

Prueba esto:

 public class NewClass3 { public static void main (String args[]){ int a [] = {1,2,}; int temp ; for(int i = 0; i 

Otra variación si tiene los datos de la matriz como una lista de Java

  listOfStuff.add( 0, listOfStuff.remove(listOfStuff.size() - 1) ); 

Solo compartí otra opción que encontré para esto, pero creo que la respuesta de @Murat Mustafin es el camino a seguir con una lista

 import java.util.Scanner; public class Shift { public static void main(String[] args) { Scanner input = new Scanner (System.in); int array[] = new int [5]; int array1[] = new int [5]; int i, temp; for (i=0; i<5; i++) { System.out.printf("Enter array[%d]: \n", i); array[i] = input.nextInt(); //Taking input in the array } System.out.println("\nEntered datas are: \n"); for (i=0; i<5; i++) { System.out.printf("array[%d] = %d\n", i, array[i]); //This will show the data you entered (Not the shifting one) } temp = array[4]; //We declared the variable "temp" and put the last number of the array there... System.out.println("\nAfter Shifting: \n"); for(i=3; i>=0; i--) { array1[i+1] = array[i]; //New array is "array1" & Old array is "array". When array[4] then the value of array[3] will be assigned in it and this goes on.. array1[0] = temp; //Finally the value of last array which was assigned in temp goes to the first of the new array } for (i=0; i<5; i++) { System.out.printf("array[%d] = %d\n", i, array1[i]); } input.close(); } } 
 public class Test1 { public static void main(String[] args) { int[] x = { 1, 2, 3, 4, 5, 6 }; Test1 test = new Test1(); x = test.shiftArray(x, 2); for (int i = 0; i < x.length; i++) { System.out.print(x[i] + " "); } } public int[] pushFirstElementToLast(int[] x, int position) { int temp = x[0]; for (int i = 0; i < x.length - 1; i++) { x[i] = x[i + 1]; } x[x.length - 1] = temp; return x; } public int[] shiftArray(int[] x, int position) { for (int i = position - 1; i >= 0; i--) { x = pushFirstElementToLast(x, position); } return x; } } 

En lugar de cambiar en una posición, puede hacer que esta función sea más general utilizando un módulo como este.

 int[] original = { 1, 2, 3, 4, 5, 6 }; int[] reordered = new int[original.length]; int shift = 1; for(int i=0; i