Matrices en Java

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:


Pero en realidad una matriz en Java es un array de arrays.
Gráficamente podemos representar la disposición real en memoria del array anterior así:

La longitud del array M (M.length) es 3.
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.
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.
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.*;

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];
        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();
            }
        }
        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();
        }
        mayor = menor = A[0][0];//se toma el primero como mayor y menor
        filaMayor = filaMenor = colMayor = colMenor = 0;

        for (i = 0; i < A.length; i++) {  //
            for (j = 0; j < A[i].length; j++) {
                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;
                }
            }           
        }
        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);
    }
}

En este ejemplo se han utilizado dos formas distintas para recorrer la matriz:
-         utilizando en el for el número de filas y columnas
-         utilizando en el for el atributo length
Para recorrer arrays irregulares como el siguiente:
int [][] a = {{6,7,5,0,4}, {3, 8, 4}, {1,0,2,7}, {9,5}};

Usaremos siempre length para obtener el número de columnas que tiene cada fila:

for (i = 0; i < a.length; i++) {  //número de filas
     for (j = 0; j < a[i].length; j++) { //número de columnas de cada fila
          System.out.print(a[i][j] + " ");
     }
     System.out.println();
}


45 comentarios:

  1. Muy interesante lo de las matrices irregulares.

    ResponderEliminar
  2. Muy completa e instructiva la entrada. Gracias, me ha resuelto muchas dudas y enseñado cosas que no sabía.

    ResponderEliminar
    Respuestas
    1. Gracias, me alegro mucho de que te haya servido de ayuda

      Eliminar
    2. ola podras ayudarme en mi duda

      Eliminar
    3. interesante muchas gracias...

      Eliminar
  3. no sirve el pinche programa

    ResponderEliminar
  4. necesit0 ayuda de hacer un programa que pida 5 calificaciones de 5 alumnos y que despliegue el nombre de los 5 alumnos y sus 5 calificaciones de cada uno y su promedio cada uno(esto lo tengo k hacer con matriz [6][7]

    ResponderEliminar
  5. muchas gracias me ayudo mucho

    ResponderEliminar
  6. tarea hacer un programa que controle un estacionamiento de cinco pisos para
    20 autos cada piso padra recibir carros color azul rojo y gris.
    nesesitamos saber si el estacionamiento esta lleno o vacio
    si el estacionamiento estalleno ya no deve res¿civir carros
    si tiene alminos algun lugar en cualquier piso deve de dejar de recibir carros
    se puede hacer una auditoria en cualquier momento de cuantos carros hay en cada piso deque color son
    por piso
    y cuantos carros hay en total y de que color son.
    una matriz de 5 por 20

    ResponderEliminar
    Respuestas
    1. yo tb necesito ayuda en un ejercicio similar a este :/

      Eliminar
  7. Hola, como estas? me prodrías ayudar ... no sé si sabes como crear dibujos en java, mas directamente transiciones? es en una clase de automatas que recibo en la U

    ResponderEliminar
  8. esta muy buena, y quisiera saber como intercambia un elemento ingresado por el usuario, y eliminar una fila o columna, gracias, mi corre es cht_2012@live.com

    ResponderEliminar
  9. Buenas tardes,
    Buenisimo tu artuculo!!
    ...tienes ejemplos de multiplicacion de matrices irregulares?

    ResponderEliminar
  10. Te Amo has salvado mi vida!!!!!! gran post!!!

    ResponderEliminar
  11. Muy buen blog y muy bien explicado. Sigue así que me has sido de gran ayuda

    ResponderEliminar
  12. hola buenas noches tengo un problema tengo una matriz de dos dimensiones y quisiera sabe como puedo almacenar una variable la posicion en la que se encuentra un dato y que cada vez que llame a la variable pase al siguiente elemento de su posicion

    ResponderEliminar
  13. mi cuestion es la siguiente: dado un ejemplo como el que pusiste con codigo, en mi caso noto que la carga se hace por columnas y no asi por filas. Como logro que sea al reves? Por cierto, muy buen blog! +10

    ResponderEliminar
    Respuestas
    1. Hola Pablo, si quieres recorrer un array bidimensional por columnas solo tienes que cambiar el orden de los for que usas:

      for (j = 0; j < COLUMNAS; j++) {
      for (i = 0; i < FILAS; i++) {
      System.out.print(A[i][j] + " ");
      }
      System.out.println();
      }
      Saludos y gracias por el comentario

      Eliminar
    2. XFAS NECESITO UN PROGRAMA URGENTE
      PROGRAMA QE ME PRESENTE LOS NUMEROS DE CADA MES SOLO CON SWITCH IF ELSE XFAS ES PARA UN EXAMEN

      Eliminar
  14. buenas tardes, mi problema es que la matriz ya le tengo escrita en un archivo excel con extension csv y lo que quiero es leerla para posteriormente poder trabajar con ella, alguien me podria indicar que codigo es el que hay que usar en este caso

    ResponderEliminar
  15. Hola me gusta como explicaste lo de los arrays. Es muy buena información. Solo quisiera preguntar algo, si tengo un arreglo bidimensional de 3 X 4 y quisiera imprimir los valores pero por columnas, como tendría que colocar el for? es decir el for inicia revisando los valores de las filas...y por ello imprime en ese orden pero quisiera que imprimiera por columnas...si pudieras ayudarme con eso lo agradecería de verdad.

    ResponderEliminar
    Respuestas
    1. Hola Yumek, para recorrer e imprimir por columnas solo tienes que cambiar el orden de los for:
      for (j = 0; j < COLUMNAS; j++) {
      for (i = 0; i < FILAS; i++) {
      System.out.print(A[i][j] + " ");
      }
      System.out.println();
      }
      Saludos

      Eliminar
  16. Hola, muy buena explicacion... pero sabes como hacer los recorridos de columnas y filas utilizando solo 1 for?

    ResponderEliminar
  17. saludos cordialmente y muchas gracias por la informacion me servira de mucho, y buena explicacion sigue adelante

    ResponderEliminar
  18. 18. Una empresa periodística publica 8 revistas. Se registra para cada una de ellas:
    Número de revista ( De 1 a 8)
    Cantidad de ejemplares vendidos
    Valor de venta de la revista
    Monto cobrado por publicidad
    Gastos de edición
    Se pide emitir un listado ordenado de mayor a menor por la ganancia o pérdida con el siguiente formato:

    N° revista Ejemplares
    vendidos Recaudado
    Por ventas Cobrado
    por publicidad Gastos
    de edición Ganancia o pérdida
    x xxx xxx Xxx xxx xxx

    ResponderEliminar
  19. amigos por favor traten de ayudarme este ejercico tanto en java y algoritmos ;
    18. Una empresa periodística publica 8 revistas. Se registra para cada una de ellas:
    Número de revista ( De 1 a 8)
    Cantidad de ejemplares vendidos
    Valor de venta de la revista
    Monto cobrado por publicidad
    Gastos de edición
    Se pide emitir un listado ordenado de mayor a menor por la ganancia o pérdida con el siguiente formato:

    N° revista Ejemplares
    vendidos Recaudado
    Por ventas Cobrado
    por publicidad Gastos
    de edición Ganancia o pérdida
    x xxx xxx Xxx xxx xxx

    ResponderEliminar
    Respuestas
    1. Pues una matriz de 8 por 7, 1 fila por revista, con 7 columnasm revista mas las entradas que das suman 5 columnas, otra columan 6 para el calculo y una 7 para numerarlas por codigo de mayor a menor por logica cargas en esta ultima columna el peso relativo 1 si es mayor a todas y 8 si es la menor comparando llenas el resto. sin nececidad de ordenar imprimis del 1 al 8 por esa ultima columna....

      Eliminar
  20. Me ayudan con la siguiente tarea:

    Una empresa de ventas a domicilio maneja 10 artículos diferentes y cuenta con 25 vendedores.
    En un arreglo de 25x10 se tienen almacenadas las cantidades de cada artículo vendidas por cada vendedor. Además, los precios de cada artículo están almacenados en un vector de tamaño 10. Se desea elaborar un algoritmo para imprimir lo siguiente:
    a) La cantidad de dinero recopilado por cada vendedor. b) El número del vendedor que recopiló la mayor cantidad de dinero. c) El número del artículo más vendido (entre todos los vendedores). d) El total de vendedores que no vendieron ningún artículo número ocho. e) Realizar un procedimiento de carga inicial para los datos en dicho arreglo. f) Realizar un entorno gráfico adecuado al usuario.

    ResponderEliminar
  21. Me ha sido de gran utilidad, pero he encontrado un ejemplo en el que muestran una calcula de matriz en java con una simple pero funcional interfaz grafica, espero que tambien les sirva.

    ResponderEliminar
  22. hola enrique soy chamit, estoy en segundo en la universidad, tenemos una asignatura de java
    aqui te dejo el enlace como son las practicas
    http://prog3.pbworks.com/w/page/58061311/Programaci%C3%B3n%203%20-%20Inicio

    ResponderEliminar
  23. buenas disculpe es URGENTE, como hago que yo introduzca mi matriz bidimensional, pero yo controlando si se desea ingresar el proxima arreglo ejm: ingreso arrg[0][n] y pregunte si quiero ingresar la siguiente que seria arr[1][n],arr[2][n] y asi hasta que yo le diga que no quiero continuar quedando el tamaño de filas de la matriz el usuario quiera???

    ResponderEliminar
  24. hola quisiera saber si este algoritmo puede ser modificado para utilizar un radom en ves de un scanner y me podrías explicar como es posible hacerlo

    ResponderEliminar
  25. me podrían ayudar con esta tarea por favor?

    Primeros intentos de descifrar Enigma Criptoanalistas británicos y de distintos países empezaron a
    interceptar mensajes procedentes de la máquina Enigma, pero sin posibilidad alguna de descifrarlos,
    hasta que en 1931 Hans-Thilo Schmidt, pasó a los aliados documentación de Enigma, que les
    permitiría crear una réplica. Ello no significaba aún poder descifrar los mensajes, pero sí el reto de
    saber cómo encontrar la clave.
    Las características del cifrado es:

    TEXTO ORIGINAL: A B C D E F G H I J K
    • Posición Enigma S S+1 S+2 S+3 S+4 S+5
    • Texto en claro B C D E F G
    • Posición Enigma S’ S’+1 S’+2 S’+3 S’+4 S’+5
    • Texto cifrado C D E F G H
    La interfaz gráfica de los ingresos deberá realizarse, a través de:

    a) Desarrollar main (menú principal) de ingreso de palabras codificadas o decodificadas.
    b) Desarrollar cada clase con sus métodos y atributos, para codificar S.
    c) Desarrollar cada clase con sus métodos y atributos, para codificar S ‘ .
    d) Desarrollar cada clase con sus métodos y atributos, para decodificar S.
    e) Desarrollar cada clase con sus métodos y atributos, para decodificar S ‘ .

    ResponderEliminar
  26. Como se podria recorrer una matrizen diagonal? De arriba a la izquierda a abajo a la derecha, por ejemplo. Es decir en vez de recorrer la matriz en lineas rectas izq-drcha, hacerlo en diagonales.

    ResponderEliminar
    Respuestas
    1. colocando las coordenadas segun como las quieras recorrer, por ejemplo si tu matriz es de 5x5 la recorrerías de arriba a la izquierda asi; [0][0],[1][1],[2][2],[3][3],[4][4],[5][5] como hacerlo? en el ciclo de recorrido podrías decir:

      int fil=0,Col=0;
      for(int c=0;c<5;c++)
      {
      mat[fil][col]=Integer.parseInt(JOptionPane.showInputDialog("Ingresar dato en fila "+f+ " Columna "+c));
      fil++;
      col++;
      }

      de esta manera cada que entres al ciclo vas a aumentar las dos coordenadas en +1 dando el esperado [0][0],[1][1],[2][2],[3][3],[4][4],[5][5]

      Eliminar
  27. no es cierto,me sirvio de mucho gracias

    ResponderEliminar
  28. a[i] = a[a[i]] como se hace esto?

    ResponderEliminar