Un array en Java puede tener más de una dimensión.
El caso más general son los arrays bidimensionales también llamados matrices
o tablas.
La dimensión de un array la determina el número de índices
necesarios para acceder a sus elementos.
Los vectores que hemos visto en otra entrada
anterior son arrays unidimensionales porque solo utilizan un índice para acceder
a cada elemento.
Una matriz necesita dos índices para acceder a sus
elementos. Gráficamente podemos representar una matriz como una tabla de n
filas y m columnas cuyos elementos son todos del mismo tipo.
La siguiente figura representa un array M de 3 filas y 5 columnas:
A los elementos del array se accede mediante la fila y columna donde están situados.
A efectos prácticos, cuando trabajamos con arrays bidimensionales podemos pensar en una tabla como la que se muestra en la imagen anterior donde los elementos están distribuidos en filas y columnas.
Pero
en realidad una
matriz en Java es un array de arrays.
La disposición real en memoria del array anterior la podemos representar gráficamente de esta forma:
M es el nombre del array.
M contiene la dirección de memoria (referencia) de un array unidimensional de 3 elementos.
Cada elemento de este array unidimensional contiene la dirección de memoria de otro array unidimensional.
Cada uno de estos últimos arrays unidimensionales contiene los valores de cada fila de la matriz.
M.length indica el número de filas de la matriz. En este ejemplo el número de filas (M.length) es 3.
M[i].length indica el nímero de columnas de la fila i. En este ejemplo la longitud de cada fila del array
(M[i].length) es 5.
Para acceder a cada elemento de la
matriz se utilizan dos índices. El primero indica la fila y el segundo la
columna.
M[0][2] = 9; //asigna el valor 9 al elemento situado en la primera fila (fila 0) y tercera columna (fila 2).
No dedemos olvidar que la primera fila de una matriz es la fila 0 y la primera columna de una matriz es la columna 0.
CREAR MATRICES EN JAVA
Se crean de forma similar a los arrays unidimensionales,
añadiendo un índice.
Por
ejemplo:
matriz
de datos de tipo int llamado ventas de 4 filas y 6 columnas:
int [][] ventas = new int[4][6];
matriz
de datos double llamado temperaturas de 3 filas y 4 columnas:
double [][] temperaturas = new double[3][4];
En
Java se pueden crear arrays irregulares
en los que el número de elementos de cada fila es variable. Solo es obligatorio
indicar el número de filas.
Por
ejemplo:
int [][] m = new int[3][];
crea
una matriz m de 3 filas.
A
cada fila se le puede asignar un número distinto de columnas:
m[0] = new int[3];
m[1] = new int[5];
m[2] = new int[2];
Gráficamente
podemos representar la disposición real en memoria del array anterior así:
INICIALIZAR MATRICES
Un array es un objeto, por lo tanto, cuando se crea, a
sus elementos se les asigna automáticamente un valor inicial:
- 0 para arrays numéricos
- '\u0000' (carácter nulo)
para arrays de caracteres
- false para arrays
booleanos
- null para arrays de
String y de referencias a objetos
También podemos dar
otros valores iniciales al array cuando se crea.
Los valores iniciales se
escriben entre llaves separados por comas.
Los valores que se le asignen a cada fila aparecerán
a su vez entre llaves separados por comas.
El número de valores
determina el tamaño de la matriz.
Por ejemplo:
int [][] numeros = {{6,7,5},{3, 8, 4}, {1,0,2}, {9,5,2}};
se crea la matriz numeros
de tipo int, de 4 filas y 3 columnas, y se le asignan esos valores iniciales.
Asignando valores
iniciales se pueden crear también matrices irregulares.
Por ejemplo la instrucción:
int [][] a = {{6,7,5,0,4}, {3, 8, 4}, {1,0,2,7}, {9,5}};
crea una matriz
irregular de 4 filas. La primera de 5 columnas, la segunda de 3, la tercera de
4 y la cuarta de 2.
RECORRER MATRICES
Para recorrer una matriz se anidan dos bucles for. En
general para recorrer un array multidimensional se anidan tantas instrucciones
for como dimensiones tenga el array.
Ejemplo de recorrido de una matriz
en Java:
Programa
que lee por teclado números enteros y los guarda en una matriz de 5 filas y 4
columnas. A continuación muestra los valores leídos, el mayor y el menor y las
posiciones que ocupan.
import java.util.Scanner;
public class Bidimensional2 {
public static void main(String[] args) {
final int FILAS = 5, COLUMNAS = 4;
Scanner sc = new Scanner(System.in);
int i, j, mayor, menor;
int filaMayor, filaMenor, colMayor, colMenor;
int[][] A = new int[FILAS][COLUMNAS]; //Se crea una matriz de 5 filas y 4 columnas
//Se introducen por teclado los valores de la matriz
System.out.println("Lectura de elementos de la matriz: ");
for (i = 0; i < FILAS; i++) {
for (j = 0; j < COLUMNAS; j++) {
System.out.print("A[" + i + "][" + j + "]= ");
A[i][j] = sc.nextInt();
}
}
//Mostrar por pantalla los valores que contiene la matriz
System.out.println("valores introducidos:");
for (i = 0; i < A.length; i++) {
for (j = 0; j < A[i].length; j++) {
System.out.print(A[i][j] + " ");
}
System.out.println();
}
//Calcular el mayor valor de la matriz y el menor.
//Obtener las posiciones que ocupan el mayor y el menor dentro de la matriz
mayor = menor = A[0][0]; //se toma el primer elemento de la matriz como mayor y menor
filaMayor = filaMenor = colMayor = colMenor = 0;
//mediante dos bucles for anidados recorremos la matriz
//buscamos el mayor, el menor y sus posiciones
for (i = 0; i < A.length; i++) { //para cada fila de la matriz
for (j = 0; j < A[i].length; j++) { //para cada columna de la matriz
if (A[i][j] > mayor) {
mayor = A[i][j];
filaMayor = i;
colMayor = j;
} else if (A[i][j] < menor) {
menor = A[i][j];
filaMenor = i;
colMenor = j;
}
}
}
//Mostrar por pantalla el mayor elemento de la matriz,el menor y las posiciones que ocupan
System.out.print("Elemento mayor: " + mayor);
System.out.println(" Fila: "+ filaMayor + " Columna: " + colMayor);
System.out.print("Elemento menor: " + menor);
System.out.println(" Fila: "+ filaMenor + " Columna: " + colMenor);
}
}
Ejemplo de recorrido de una matriz irregular en Java:
Programa que crea una matriz irregular de enteros. El número de filas se pide por teclado. Para cada fila se pedirá el número de columnas que tiene. El número mínimo de filas debe ser 2 y el número mínimo de columnas debe ser 1. A continuación asigna a cada elemento de la matriz un número aleatorio del 1 al 5. Finalmente muestra por pantalla el contenido de la matriz.
import java.util.Random;
import java.util.Scanner;
public class MatrizIrregular {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random rnd = new Random();
int filas, columnas;
do { //lectura de las filas
System.out.print("Introduce número de filas: ");
filas = sc.nextInt();
if (filas < 2) {
System.out.println("Valor no válido");
}
} while (filas < 2);
//se crea el array solo con el número de filas
//el número de columnas se deja vacío
//el número de columnas para cada fila lo indicaremos después
int[][] A = new int[filas][];
//para cada fila pedimos el número de columnas que tendrá
for (int i = 0; i < A.length; i++) {
do {
System.out.print("Número de columnas para la fila " + i + ": ");
columnas = sc.nextInt();
if (columnas < 1) {
System.out.println("Valor no válido");
}
} while (columnas < 1);
//Se crea un array del tamaño indicado y se le asigna a la fila
A[i] = new int[columnas];
}
//A cada elemento de la matriz se le asigna un valor aleatorio del 1 al 5
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A[i].length; j++) {
A[i][j] = rnd.nextInt(5) + 1;
}
}
//Se muestra el contenido de la matriz
System.out.println("Contenido del array:");
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A[i].length; j++) {
System.out.print(A[i][j] + " ");
}
System.out.println();
}
}
}
Puedes encontrar más ejercicios para seguir practicando en este libro.
Contiene ejercicios resueltos sobre los conceptos básicos del lenguaje java: Declaración de variables, literales, tipos de datos, operadores, crear expresiones algebraicas correctas, etc.
Las soluciones de los ejercicios incluyen una explicación detallada sobre cómo se ha resuelto.
El contenido del libro es una recopilación de ejercicios realizados en mis clases de Programación en los ciclos formativos de grado superior Desarrollo de aplicaciones web y Desarrollo de aplicaciones multiplataforma.