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