Rotar los elementos de un ArrayList en Java

Método para desplazar todos los componentes de un Array un lugar a la derecha. El último elemento pasará a la primera posición.
Ejemplo, si el Array original contiene los siguientes valores:

15
22
4
56
71
10
2

Se realizarán los siguientes desplazamientos:
De forma que el contenido final de Array sea este:

2
15
22
4
56
71
10

En este caso el contenedor será un ArrayList. El método recibirá un ArrayList de tipo Integer con una serie de valores numéricos y devolverá el mismo ArrayList con sus elementos desplazados una posición a la derecha. Los desplazamientos se realizarán sobre el mismo array. No se puede utilizar un array auxiliar para reailzar el proceso.
Solución:
Vamos a resolverlo de dos maneras. La primera será el método que podríamos llamar clásico para rotar las componentes de un array que consiste en  guardar el último elemento del array en una variable auxiliar, a continuación desplazar todos los elementos una posición a la derecha desde el final hasta el principio del array y por último asignar al primer elemento el valor guardado en el auxiliar.
Este es el código Java de este primer método de desplazamiento:
public static void desplazarDerecha(ArrayList<Integer> a) {
        int i;
        int aux = a.get(a.size() - 1); //guardar el último elemento en una variable                          
        for (i = a.size() - 1; i > 0; i--) { //desplazar los elementos
            a.set(i, a.get(i - 1)); //a cada elemento se le asigna el anterior
        }
        a.set(0, aux); //asignar al primero el último que se guardó al principio
}

La segunda forma de resolverlo es utilizando dos métodos de la clase ArrayList:
add(posición, valor);
remove(posición);
Con el método add insertamos al principio del ArrayList el último valor. Insertar en una posición significa crear un elemento nuevo en esa posición y desplazar el resto de los elementos hacia la derecha.
Por ejemplo, si el array es este:

15
22
4
56
71
10
2

Al insertar el último elemento al principio, el contenido del array ahora es este:

2
15
22
4
56
71
10
2

Solo queda eliminar el último elemento y tendremos el resultado:

2
15
22
4
56
71
10

Este es el código Java de este segundo método de desplazamiento:
public static void desplazarDerecha2(ArrayList<Integer> a) {
        int aux = a.get(a.size()-1);  //guardar el último elemento en una variable                           
        a.add(0,aux);                 //insertar al principio el último valor
        a.remove(a.size()-1);         //eliminar el último elemento
}
Programa completo para utilizar estos métodos:
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        ArrayList<Integer> A = leerArray();
        mostrar(A);
        //utilizando el método clásico
        desplazarDerecha(A);
        mostrar(A);
        //utilizando solo los métodos de ArrayList
        desplazarDerecha2(A);
        mostrar(A);
    }

    //pedir por teclado los valores del ArrayList
    public static ArrayList<Integer> leerArray() {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> numeros = new ArrayList<>();
        int N;
        do {
            System.out.print("Número de elementos del array (>0): ");
            N = sc.nextInt();
        } while (N <= 0);
        for (int i = 0; i < N; i++) {
            System.out.print("elemento[" + i + "]= ");
            numeros.add(sc.nextInt());
        }
        return numeros;
    }

    //método clásico: guardamos el último elemento en un auxiliar,
    //desplazamos todos los elementos una posición a la derecha
    //finalmente guardamos en el primer elemento el valor guardado en el auxiliar
    public static void desplazarDerecha(ArrayList<Integer> a) {
        int i;
        int aux = a.get(a.size() - 1); //guardar el último elemento en una variable                          
        for (i = a.size() - 1; i > 0; i--) { //desplazar los elementos
            a.set(i, a.get(i - 1)); //a cada elemento se le asigna el anterior
        }
        a.set(0, aux); //asignar al primero el último que se guardó al principio
    }

    //Utilizando métodos de ArrayList:
    //guardamos el último elemento en una variable
    //insertamos este elemento al principio
    //eliminamos el último elemento
    public static void desplazarDerecha2(ArrayList<Integer> a) {
        int aux = a.get(a.size()-1);     
        a.add(0,aux);
        a.remove(a.size()-1);
    }
   
    //Método para mostrar todo el ArrayList
    public static void mostrar(ArrayList<Integer> a) {
        System.out.println(a);
    }
}

2 comentarios:

  1. public static void main(String[] args) {
    // TODO Auto-generated method stub

    ArrayList tabla= new ArrayList();

    datosLista(tabla);
    rotar(tabla);
    }

    private static void rotar(ArrayList tabla) {
    // TODO Auto-generated method stub
    int aux= tabla.get(0);
    tabla.remove(0);
    tabla.add(aux);
    System.out.println("algo");

    }

    private static void datosLista(ArrayList tabla) {
    // TODO Auto-generated method stub
    tabla.add(15);
    tabla.add(22);
    tabla.add(4);
    tabla.add(56);
    tabla.add(71);
    tabla.add(10);
    tabla.add(2);
    }

    ResponderEliminar
  2. Utilizando los metodos de ArrayList lo hice de esta forma:

    public void rotacionArrayList (){

    ArrayList array = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));

    System.out.println(array);

    array.add(0, array.get(array.size()-1));
    array.remove(array.size()-1);

    System.out.println(array);

    }

    ResponderEliminar