una rotar resueltos posiciones matriz matrices llenar intercambiar filas ejemplos como columnas bidimensionales arreglos arreglo array java arrays algorithm shift

rotar - Java, desplazamiento de elementos en una matriz



matriz java filas columnas (13)

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.

Tengo una matriz de objetos en Java, y estoy tratando de llevar un elemento a la cima y desplazar el resto 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?


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<original.length;i++) reordered[i] = original[(shift+i)%original.length];


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


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.


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


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


Prueba esto:

public class NewClass3 { public static void main (String args[]){ int a [] = {1,2,}; int temp ; for(int i = 0; i<a.length -1; i++){ temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; } for(int p : a) System.out.print(p); } }


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.



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;


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


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