Arreglos multidimensionales

Los arreglos vistos anteriormente se conocen como arreglos unidimensionales (una sola dimensión) y se caracterizan por tener un solo subíndice. Estos arreglos se conocen también por el término listas. Los arreglos multidimensionales son aquellos que tienen más de una dimensión y, en consecuencia, más de un índice. Los arreglos más usados son los de dos dimensiones, conocidos también por el nombre de tablas o matrices. Sin embargo, es posible crear arreglos de tantas dimensiones como requieran sus aplicaciones, esto es, tres, cuatro o más dimensiones. 

Un arreglo de dos dimensiones equivale a una tabla con múltiples filas y columnas. Observe que en el arreglo bidimensional de la siguiente figura, si las filas se etiquetan de 0 a m y las columnas de 0 a n, el número de elementos que tendrá el arreglo será el resultado del producto (m+1)*(n+1). El sistema para localizar un elemento será a través de las coordenadas representadas por su número de fila y su número de columna (a,b).

Estructura de un arreglo de dos dimensiones

Sintaxis

La declaración y creación de un arreglo multidimensional es:

       tipo [] [] nombre_arreglo = new tipo[NumeroDeFilas][NumeroDeColumnas];

Ejemplo

       char [][]pagina = new char[50][80];
       int [][]puestos = new int[6][8];

       int matriz[][] = new int[4][2];
       int matriz[][];                                     // declara la variable arreglo 
       matriz = new int[4][2];                // crea el arreglo; lo asigna a la
                                                                            variable tipo arreglo

En la declaración, los corchetes que van después del nombre de la variable matriz indican que matriz es una variable que hará referencia a un arreglo de valores int. En la sentencia de asignación, la variable arreglo matriz recibe la referencia a un nuevo arreglo de 4 filas y 2 columnas int.

Un arreglo de dos dimensiones en realidad es un arreglo de arreglos. Es decir, es un arreglo unidimensional, y cada elemento no es un valor entero, o de coma flotante o carácter, sino que cada elemento es otro arreglo.

Inicialización de arreglos multidimensionales

Los arreglos multidimensionales se pueden inicializar, al igual que los de una dimensión, cuando se declaran. La inicialización consta de una lista de elementos separados por comas y encerradas entre llaves.

Ejemplo

       int b[][] = {{2,1}, {3,4}};

Los valores del inicializador se agrupan por fila entre llaves. Así, 2 y 1 inicializan a b[0][0] y b[0][1], respectivamente; 3 y 4 inicializan a b[1][0] y b[1][1], respectivamente. Los arreglos multidimensionales se mantienen como arreglos de arreglos unidimensionales. Por lo tanto, el arreglo b en la declaración anterior está realmente compuesto de dos arreglos unidimensionales separados: uno que contiene los valores en la primera lista inicializadora anidada {2,1} y uno que contiene los valores en la segunda lista inicializadora anidada {3,4}. Así, el arreglo b en sí es un arreglo de dos elementos, cada uno de los cuales es un arreglo unidimensional de valores int.

Acceso a los elementos de un arreglo multidimensional

Se puede acceder a los elementos de arreglos bidimensionales de igual forma que a los elementos de un arreglo unidimensional. La diferencia reside en que los elementos bidimensionales deben especificarse los indices de la fila y la columna.

Sintaxis

       nombre_arreglo[indice_fila][indice_columna];

Ejemplos

       Tabla[2][3];
       Resistencias[2][4];
       AsientosLibres[5][12];

Arreglos bidimensionales con filas de distintos tamaños

La forma que se representan los arreglos multidimensionales lo hace bastante flexibles. De hecho, los tamaños de las filas en el arreglo b no tienen que ser iguales.

Ejemplo

        int b[][] = {{2,1}, {3,4,5}};

crea el arreglo entero b con dos elementos que representan las filas del arreglo bidimensional. Cada elemento de b es una referencia a un arreglo unidimensional de variables int. El arreglo int de la fila 0 es un arreglo unidimensional con dos elementos (2 y 1), y el arreglo int de la fila 1 es un arreglo unidimensional con tres elementos (3, 4 y 5).

Creación de arreglos bidimensionales mediante expresiones de creación de arreglos

Un arreglo multidimensional con el mismo número de columnas en cada fila puede crearse mediante una expresión de creación de arreglos. Por ejemplo en las siguientes líneas se declara el arreglo b y se le asigna una referencia a un arreglo de tres por cuatro:

        int b[][] = new int[3][4];

En este caso, utilizamos los valores literales 3 y 4 para especificar el número de filas y columnas, respectivamente, pero esto no es obligatorio. Los programas también pueden utilizar variables para especificar las dimensiones de los arreglos, ya que new crea arreglos en tiempo de ejecución, no en tiempo de compilación. Al igual que con los arreglos unidimensionales, los elementos de un arreglo multidimensional se inicializan cuando se crea el objeto arreglo.

Un arreglo multidimensional, en el que cada fila tiene un número distinto de columnas, puede crearse de la siguiente manera:

        int b[][] = new int[2][];            // crea 2 filas
        b[0] = new int[5];                      // crea 5 columnas para la fila 0
        b[1] = new int[3];                      // crea 3 columnas para la fila 1

Estas sentencias o instrucciones crean un arreglo bidimensional con dos filas. La fila 0 tiene cinco columnas y la fila 1 tiene 3 columnas.

Listas de arreglos (ArrayList)

Los arreglos son una construcción básica. En esta sección se explica la clase ArrayList que le permite reunir (coleccionar) objetos como si fueran tipos de datos básicos. La lista de arreglos ofrece dos ventajas:

  • La lista de arreglos puede crecer y reducirse a medida que se necesita.
  • La clase ArrayList proporciona métodos para muchas tareas comunes, como inserción y eliminar elementos.

La clase ArrayList es una clase genérica: ArrayList<T> reúne objetos de tipo genérico T.

Sintaxis

Para crear un ArrayList se declara de la siguiente manera:

       ArrayList nombre_lista = new ArrayList();

Si queremos trabajar con tipos de datos o cadenas tendríamos que usar ArrayList génerica y se declara de la siguiente manera:

       ArrayList<String> lista = new ArrayList();

Así, no se podrá ingresar otro tipo de dato que no sean cadenas. (Ver Listas)

Ejemplo

       1. Cantidad[] numeros = {5.0,4.5,7.5,14.0};
            ArrayList<Cantidad> listaArticulos = new ArrayList();

       Creación, e inicialización de una lista de arreglos Cantidad.

       2. Definir una lista de arreglos de cuentas bancarias.
            ArrayList<CuentaBancaria> cuentas = new ArrayList();

Métodos de listas de arreglos (ArrayList)

La clase ArrayList forma parte del paquete java.util y tiene los siguientes métodos:

  • boolean add(Object elemento): Añade un elemento al ArrayList y lo posiciona al final de la lista.
  • void add(int índice, Object elemento): Añade un elemento en la posición indicada por el índice.
  • Object get(int índice): Devuelve un elemento de la posición indicada.
  • Object remove(int índice): Elimina un elemento en el índice indicado.
  • clear(): Elimina todos los elementos de la lista (ArrayList).
  • int indexOf(Object elemento): Devuelve el índice donde se encuenta el elemento. Si no se encuentra el elemento devuelve -1.
  • int size(): Devuelve el número de elemento de la lista (ArrayList).
  • void set(int índice, Object elemento): Modifica un elemento que se encuentra en el índice indicado.

Bucle for each

Java 5.0 incorporó un nuevo tipo de bucle for, ya estudiado con anterioridad, que puede iterar a través de todos los elementos de una colección, incluso aunque no haya índices de los elementos, como sucede con los arreglos. Este nuevo tipo de bucle se denomina bucle for each o bucle for mejorado. Estos bucles se utilizan muy eficientemente en las clases colección. (Ver sentencia-for each)

Sintaxis

       for(tipo elemento : nombre_arreglo)
              sentencia;
       for(tipo elemento : nombre_colección)
              sentencia;

Ejemplo

       1. ArrayList<String> listasCadenas = new ArrayList();
            for(String cd : listasCadenas)
                   System.out.println(cd);

       2. double []b = new double[30];
            // rellenar el arreglo
            for(double e : b)
                   suma += e;

Regla

El bucle for each puede hacer su código mucho más claro y mucho menos propenso a errores. Si no se utiliza la variable con índice en un bucle for para una aplicación diferente a realizar bucles (ciclos) a través de los elementos de un arreglo, es preferible utilizar un bucle for each.

Ejemplo

El bucle

       for(double elemento : m)                        // el arreglo m tiene el tipo double
              elemento = 0.0;

es preferible a

       for(int i=0;i<a.length;i++)
              a[i] = 0.0;

Estos dos bucles realizan las mismas acciones, pero la segunda requiere un índice i para numerar los elementos del arreglo. La primera opción establece cada elemento del arreglo a 0.0 y significa: «Para cada elemento de m se pone 0.0». Se puede utilizar también el bucle for mejorado para recorrer todos los elementos de un arreglo lista.

Ejemplo

El siguiente arreglo calcula el valor total de todas las cuentas de un banco.

       ArrayList<CuentaBanco> listaCuentas = new ArrayList();
       double suma=0.0;
       for(CuentaBanco c : listaCuentas){
              suma = suma+c.leerSaldo();
       }

Este bucle es equivalente al siguiente bucle ordinario:

       double suma=0.0;
       for(int j=0;j<listaCuentas.size();j++){
              CuentaBanco c = listaCuentas.get(j);
              suma = suma+c.leerSaldo();
       }