martes, 18 de septiembre de 2018

5. Arrays/Matrices

Imagínate un día tranquilo de picnic en el campo, con tu perro Toby y tu primo Timmy, pasando un agradable día bajo la luz del sol... hasta que te das cuenta de que te has dejado la mayonesa para tu sandwich en tu casa porque tenías que añadir más cosas, como el chorizo, el tupper de ensalada y el palo selfie para el correspondiente postureo en Instagram, fingiendo que tienes vida social.

Ahora... ¿qué hubiese pasado si todo lo que necesitas lo hubieses guardado en un paquete, compacto, y sólo tuvieras que coger el paquete para irte de picnic?

Los Arrays, también conocidos como Matrices o Vectores, son una cosa parecida. En Java (y en otros muchos lenguajes de programación), nos sirven para agrupar un conjunto de variables del mismo tipo bajo el mismo nombre, y poder acceder a ellas simplemente mediante un índice numérico. Me explico.

Primeramente, ¿a qué nos referimos con variables del mismo tipo? Imagínate que tienes un Vector de frutas (ahora explicaremos más adelante la diferencia entre un vector y una matriz). A un vector frutas le puedes añadir una fruta "pera", otra fruta "manzana", otra fruta "plátano"... pero a lo mejor si intentas colar una skin del Fortnite, probablemente el programa te pregunte primero si te encuentras bien, y seguidamente te dé un error de compilación.
Esto es lo mismo que si intentas guardar una variable de tipo String en otra de tipo int.

Una vez aclarado esto, vamos a hablar de la diferencia de un vector.
 - Un vector, trabaja en "una sola dimensión". Es como una lista en el mundo real.

   ----- x -----                  ----- x -----
[ 0, 1, 2, 3, 4 ... ]       [ "a", "b", "c", "d" ... ]


- Una matriz, trabaja en "dos o más dimensiones". Algo parecido a una tabla:

    --- y ---
 |  [ 0 1 2 ]   - Como podéis ver, para referirnos a un elemento de
x  [ 3 4 5 ]     una matriz de dos dimensiones, tendremos que dar
 |  [ 6 7 8 ]     los valores "x" e "y" a la matriz para referirnos a ese elemento.

Ahora bien, ¿cómo declaramos un vector o una matriz? Bastante parecido a declarar una variable.

tipovariable[][][][]... nombrevariable = new tipovariable [x][y][z][k]...

Ok, ahora posiblemente vuestra cabeza esté haciendo trompos. No os preocupéis, es más sencillo de lo que parece.

  • tipovariable: como el nombre indica, define si la matriz va a ser un conjunto de variables del tipo int, String, boolean, etc...
  • [][][]: la fiesta de los corchetes. El número de corchetes indica el número de dimensiones que queremos que tenga la matriz. Por ejemplo, si queremos una matriz de una sola dimensión (un vector), utilizaremos únicamente un corchete. Si queremos que tenga dos, usaremos dos. Y así hasta que te canses.
  • nombrevariable: el nombre que le vayamos a dar a la matriz. Igual que si fuera una variable normal.
  • [x][y][z]...: aquí es donde puede estar lo más complicado. Lo "malo" de una matriz es que no crece dinámicamente, es decir, le tenemos que dar un tamaño, que va a coincidir con el tamaño final. Este tamaño NO se puede aumentar luego. También, tiene que tener tantos corchetes como dimensiones hayamos especificado antes, y tenemos que indicar el tamaño de estas dimensiones.
Llega la hora del ejemplo, para no tener que hacerme un batido con galletas con vuestros bulbos raquídeos:

int[] vector_normalico = new int[5]

Ok, ¿qué tenemos? Pues tenemos un vector (una única dimensión) de tipo int, que puede contener hasta 5 elementos. 5 no son 6 ni 27.
Por ejemplo, puede albergar los números del 1 al 5 si así lo queremos.

Vamos a subir un poco el nivel:

double[][] matriz_2D = new double[3][4]

Vale, toca relajarse. Lo que tenemos aquí es una matriz, de tipo double (no por nada, sino por cambiar y no poner siempre int), que tiene dos dimensiones: la primera de 3 elementos y la segunda de 4. Como podéis ver, no es necesario que ambas dimensiones tengan el mismo tamaño. Imaginaos una matriz de dimensiones como una "tabla" con sus respectivas "filas" y "columnas".

De nuevo, una matriz puede tener técnicamente hasta 255 dimensiones, pero no se suelen utilizar más de tres.

Imaginad que habéis entendido ya todo lo anterior y lo habéis asimilado en vuestra cabeza. Y ahora... ¿qué? Tenemos una matriz o un vector vacíos, ¿cómo los rellenamos con datos? Tiene menos miga que hacerse un bocadillo de chorizo (jaja, miga, ¿lo pilláis? Bocadillo, pan, miga... normal que escriba un blog y no tenga amigos).

Para darle valores a las "casillas" de un vector o una matriz, utilizaremos un índice.
Hay que tener en cuenta, que la primera posición de un Array NO es el 1, es el 0.

Así pues, imaginad que tenemos el siguiente código:




Pero.. como que dar uno a uno el valor a cada índice de un vector, no es muy eficiente... ¿no?
Vamos a darle un pequeño empujón con un bucle for:




Bastante simple: hemos creado un bucle que se repite 5 veces, y que va dando el valor de i en cada momento a vector_normalico[i]. Es decir, vector_normalico[0]=0, vector_normalico[1]=1, etc...

¿Qué pasa con una matriz de dos dimensiones? Exactamente igual, sólo que usaremos dos bucles para automatizarlo en lugar de uno:




Como podéis ver, trabajar con arrays puede parecer bastante complejo al principio, pero con un poco de práctica seguro que os dais cuenta de lo útiles que pueden llegar a ser.

0 comentarios:

Publicar un comentario