You are on page 1of 20

Introduccin a los arreglos

Objetivo: En esta unidad ser capaz de identificar cuales son los tipos de arreglos, su uso y comprender de que manera acceden a la memoria.
Las matrices se empezaron a utilizar en pocas antes de Cristo. Sin embargo fue hasta el siglo XXVII que las ideas reaparecieron y el desarrollo comenz. No es sorprendente que los comienzos de las matrices surgieran a travs del estudio de sistemas de ecuaciones lineales considerando que los babilonios y los chinos estudiaron problemas que llevaron a ecuaciones lineales simultneas. El trmino matriz fue utilizado por primera vez en 1850 gracias a Hamilton nuevamente desde el punto de vista de las transformaciones lineales y analiz sus propiedades especficas. En 1858, A. Cayley introduce la notacin matricial como una forma abreviada de escribir un sistema de m ecuaciones lineales con n incgnitas. Contribuciones posteriores de diversos autores permitieron pasar del lgebra matricial al lgebra lineal. Las matrices se utilizan en el clculo numrico, en la resolucin de sistemas de ecuaciones lineales, de las ecuaciones diferenciales y de las derivadas parciales. Adems de su utilidad para el estudio de sistemas de ecuaciones lineales, las matrices aparecen de forma natural en geometra, estadstica, economa, informtica, fsica, etc. A pesar de ser un concepto muy antiguo, la tecnologa del nuevo milenio an lo utiliza, la aplicacin de ste concepto es muy importante en la actualidad ya que la ciencia de la informtica la ha tomado en cuenta para sus trabajos en casi cualquier lenguaje de programacin. Una matriz, se utiliza para almacenar datos de cualquier tipo; o objetos al igual que una matriz matemtica, tiene dos dimensiones (renglones y columnas) que se denominan por el nmero de rengln y el nmero de columna. Se utilizan especialmente para guardar datos en la memoria y se pueden utilizar para resolver toda clase de problemas. Para solucionar este tipo de situaciones, los lenguajes de programacin poseen estructuras de datos que permiten declarar (y utilizar) con un solo nombre un conjunto de elementos ordenados de un mismo tipo; estas estructuras de datos son los arreglos (matrices y vectores). Los arreglos en el lenguaje de programacin Java son similares a los de otros idiomas de alto nivel. Un arreglo es simplemente un objeto con una coleccin de elementos numerados del mismo tipo. Donde cada elemento o celda en el arreglo tiene un ndice. Las celdas estn numeradas del 0 a n-1, donde n es el nmero de celdas del arreglo, es decir, su capacidad.

1.1. Arreglos unidimensionales (vectores). Un arreglo unidimensional es un tipo de dato abstracto que est formado de una coleccin finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales - En Java se pueden manejar arreglos de elementos de tipo primitivo (boolean, byte, char, double, float, int, long, short) o arreglos de objetos -. El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a los elementos anteriores o posteriores, esto mediante el uso de un ndice para cada elemento del arreglo que nos da la posicin relativa.

Acceso a los datos

En los arreglos, los elementos se colocan en forma ordenada, linealmente numerando las posiciones individuales que componen el vector a partir del ndice 0 y hasta el ndice n -1. Por ejemplo, las estaturas de los alumnos de Programacin Orientada a Objetos (POO) se podran representar de la siguiente manera (Figura 2.1):

Figura 2.1. Representacin grfica de un vector. Declaracin de un vector

La instruccin que genera un vector de tres nmeros doubles es:

Figura 2.2. Declaracin de un vector. Cdigo Java double[] x; x = new double[3]; Representacin en memoria

double x[]; x = new double[3]; double[] x = new double[3] ; double x = new double[3];

El valor inicial de los arreglos es cero para los numricos, vacio para los String. Para hacer referencia a los elementos particulares del vector, se utiliza el identificador del vector junto con el ndice del elemento entre corchetes. El ndice del primer elemento es el cero (0) y el del ltimo, el nmero de elementos menos uno.

Para almacenar el valor del elemento tres, utilizamos la sentencia de asignacin:

x[2] = 1.70; La asignacin a una variable es similar

double k = x[2];

Si desea crear y asignar valores a un vector podra usarse la siguiente instruccin double[] x = {1.70, 1.86, 1.65}; Para obtener el nmero de elementos de un vector en tiempo de ejecucin se accede al atributo length del arreglo. No olvidemos que los vectores en Java son tratados como un objeto. int n = x.length;

Una de las grandes ventajas que representan los arreglos es la posibilidad que existe para recorrer sus elementos con una instruccin repetitiva, como por ejemplo: for, while, do .. while; for(int i = 0; i < 50; i++) { System.out.println(estatura[i]); } while (i < n) { System.out.println(estatura[i]); i++; } do { System.out.println(estatura[i]); i++; } while (i < n);

Ejemplo: A continuacin se desarrolla una clase que implementa tres mtodos el primero genera "n" nmeros enteros, el segundo los imprime y el ltimo obtiene el promedio de estos "n" nmeros. Arreglo01.java

Prueba_Arreglo01.java

Ejemplo: Se definen dos arreglos "nombre" y "calificacin"; la primera con elementos String y la segunda con elementos int. Se introducen los nombres y las calificaciones obtenidas, se imprime la lista y, posteriormente se imprime el nombre y calificacin de los alumnos que alcanzaron 90 o ms.

Alumnos.java

Prueba_Alumnos.java

: Desarrollar el cdigo necesario para obtener la suma y el promedio del contenido de un vector de nmeros del tipo flotante.

1.2 Arreglo bidimensional Un arreglo bidimensional o matriz se utiliza a menudo para representar tablas de valores, que consta de informacin ordenada en renglones y columnas. Este tipo de arreglos al igual que los vectores es un tipo de dato estructurado, finito ordenado y homogneo. Para identificar un elemento especfico de una tabla debemos manejar dos ndices. Por convencin, el primer ndice identifica el rengln y el segundo la columna (Figura 1.4).

Figura 1. 4. Representacin grfica de una matriz. La declaracin de una matriz tiene la siguiente sintaxis: tipo_dato nombre_arreglo[][] = new tipo_dato[rengln][columna]; A continuacin se presentan una serie de ejemplos. int[][] calif= new int[4][4]; int x[][] = new int[10] [5];
int arreglo[][]={{1,2,3},{4,5,6}}

double[][] ingresos = new double[3][4]; float[][] calificacion = new float[50][7]; Para efectuar cualquier proceso de captura, operaciones o despliegue con todos los elementos de la tabla se debern usar 2 ciclos. Por ejemplo un for externo para controlar el rengln y un for interno para controlar la columna. Una matriz, en realidad, es un vector de vectores:

En Java, el ndice del primer componente de un vector es siempre 0, por lo que matriz[0][0] ser el primer elemento de la matriz. El tamao de la matriz puede obtenerse utilizando la propiedad matriz.length: matriz.length nos da el nmero de renglones. matriz[0].length nos da el nmero de columnas.

matriz[i].length Nmero de columnas por rengln. Java permite declarar matrices con diferente nmero de columnas por rengln. matriz[matriz.length-1][matriz[0].length-1], representa el ltimo elemento de la matriz es

Operaciones: En una matriz se pueden realizar las mismas operaciones que con los vectores. Lectura:
class imprime_matriz { private static int arreglo[][]={{1,2,3},{4,5,6},{7,8,9}};

//Obtener el nmero de renglones de arreglo


private static int r = arreglo.length;

//Obtener el nmero de columnas de arreglo


private static int c = arreglo[0].length; public static void main (String [] args) { for (int i=0;i < r; i++) for (int j=0;j < c;j++) System.out.println("["+i+"]["+j+"]="+arreglo[i][j]); }//end }//class

Escritura: Class escribe_matriz {


private static int arreglo[][]={{1,2,3},{4,5,6},{7,8,9}};

//Obtener el nmero de renglones de arreglo


private static int r = arreglo.length;

//Obtener el nmero de columnas de arreglo


private static int c = arreglo[0].length;

public static void main (String [] args) { for (int i=0; i < r; i++) {

for (int j=0; j < c; j++) System.out.print(tabla[i][j] + ); System.out.println(); }


}//main }//class

Ejemplo 103: Se implemento mediante una matriz las tablas de multiplicar. La clase se desarrolla mediante el diagrama de clase de la figura 1.5 y el diagrama de secuencias de la figura 1.6.

Figura 1.5. Diagrama de clases ejemplo 302.

Figura 1.6. Diagrama de secuencias ejemplo 102 Cdigo 107. Asignar a una matriz los resultados de las tablas de multiplicar del 0 al 10.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:

class Tablas { //numero de elementos private final int MAXIMO = 11; private int [][] tabla = new int[MAXIMO ][MAXIMO ]; public void creaTablas() { for (int i=1;i < tabla.length;i++) for (int j=1;j < tabla[i].length;j++) tabla[i][j] = i*j; }//creaTablas public void imprimeTablas() { //Se imprime la tabla System.out.println("Tablas del 1 al 10\n"); for (int i=1;i < tabla.length; i++) { for (int j=1;j < tabla[i].length; j++) System.out.println(i + " X "+ j + " = "+tabla[i][j]+"\t"); System.out.println("\t"); }//for i = 0 }//imprimeTablas } public class Codigo107 { public static void main(String[] args) { Tablas MisTablas = new Tablas(); MisTablas.creaTablas(); MisTablas.imprimeTablas(); }//main }//class

30:

Las lneas del 3 y 4 describen los atributos de la clase Tablas, en este caso mximo y tabla. Las lneas 6 al 10 describen el mtodo creaTablas, el cual mediante dos ciclos for almacena los valores de las tablas de multiplicar en la matriz.
Las lneas 12 al 21 implementan el mtodo imprimeTablas el cual vaca en la pantalla el contenido de la matriz. Por ltimo las lneas 24 al 30 implementan el main de la clase. 1.3 Arreglo multidimensional Este tambin es un tipo de dato estructurado, que esta compuesto por n dimensiones. Para hacer referencia a cada componente del arreglo es necesario utilizar n ndices, uno para cada dimensin. La declaracin de un arreglo de tres dimensiones tiene la siguiente sintaxis:
tipo_dato nombre_arreglo[][][] = new tipo_dato[X][Y][Z];

Ejemplo: int[][][] dato = new int[10][10][3]; byte[][][][] arreglo = new byte[5][6][2][3]; Las operaciones en los arreglos multidimensionales son las mismas que en los tipos de arreglos anteriores, ya que se considera a los arreglos bidimensionales como multidimensionales. 1.4. Matrices de objetos Java es capaz crear arreglos numricos y cadenas, adems tambin es posible crear arreglos de objetos. Por ejemplo: class Persona { String nombre; int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad;

} } //Persona // matriz de personas Persona clientes[] = new Persona[20]; Crea un arreglo de 20 referencias a objetos de la clase Persona. Observe que se usaron corchetes [ ]. Si se usara (20), se estara creando una instancia de Persona, no un arreglo.

Las matrices de objetos contienen atributos y mtodos. Los objetos contenidos dentro de una matriz se crean igual que cualquier otro objeto.

Observe que as como Persona referencia un objeto, clientes[i] tambin referencia un objeto. Por lo tanto, si se desea usar este arreglo, es necesario crear 20 objetos. Por ejemplo: // crea una persona y la guarda en la primera posicin clientes[0] = new Persona("PEPE",18); Ejemplo 104: A continuacin se implementa el uso de las matrices de objetos. Algunos conceptos Constructores, la referencia this- no se abordan aun y su explicacin se dejara para ms tarde. Cdigo 109. Declaracin de matrices de objetos, 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: } } //Persona class Empleado { public String nombre; class Persona { String nombre; int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad;

11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: }

public String direccion; public int numero; public Empleado(String nombre, String direccion, int numero) { this.nombre = nombre; this.direccion = direccion; this.numero = numero; } public void checaDatos() { System.out.println(); System.out.println("Empleado: " + nombre + " " + direccion + " " + numero); }

class Codigo109 { public static void main(String[] args) { // Crear un arreglos denominado lasPersonas que // contiene 5 referencias de Personas Persona[] lasPersonas new Persona[5]; //Muestra el taao del arreglo System.out.println("Longitud del vector lasPersonas = " + lasPersonas.length); lasPersonas[0] = new Persona("Monica", 11); //Se declara un vector de tipo Empleado Empleado[] miEmpresa; miEmpresa = new Empleado[500]; miEmpresa[227] = new Empleado("Vicente Fox", "Los Pinos", 8); miEmpresa[227].checaDatos(); //Esto producira un error de ejecucin

41: 42: 43: 44: 45: 46: 47: } }

miEmpresa[1].checaDatos();

El cdigo 109 implementa en las lneas 1 al 9 la clase Persona, en las lneas 5 al 8 implementa el constructor de la clase, cuyo objetivo es asignarle valores a los atributos de la clase (nombre y edad).

La clase Empleado se implementa en lneas 11 al 27, en las lneas 16 al 20 implementa el constructor de la clase, cuyo objetivo es asignarle valores a los atributos de la clase (nombre, direccin y nmero). Las lneas 22 al 26 describen el mtodo checadatos el cual muestra los valores de los atributos de la clase.

La clase Codigo109 se implementa en las lneas 29 al 47. En la lnea 33 se crea un vector de tipo Personas, al cual en la lnea 37 se asignan los valores para los atributos del primer elemento de lasPersonas. Algo similar ocurre con el arreglo miEmpresa en las lneas 39 y 40. La lnea 43 muestra la aplicacin de mtodos en un arreglo. Por ltimo la lnea 45 producir un error en tiempo de ejecucin debido a que el arreglo en esa posicin no esta inicializado. Extra: La biblioteca de clases de Java incluye una clase auxiliar llamada java.util.Arrays que incluye como mtodos algunas de las tareas que se realizan ms a menudo con vectores (Cdigo 110):

Arrays.sort(v) ordena los elementos del vector. Arrays.equals(v1,v2) comprueba si dos vectores son iguales. Arrays.fill(v,val) rellena el vector v con el valor val. Arrays.binarySearch(v, k) busca el valor k dentro del vector v (que previamente ha de estar ordenado).

Cdigo 110. Ejemplo del uso de java.util.array

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:

import java.util.Arrays; class Mostrar { void imprime( String mensaje, int x[] ) { int n = x.length; System.out.println(mensaje); for(int i = 0; i < n; i++) System.out.println( x[i]); } } class Codigo110 { static int[] x = {5, 8, 10, 5, 3}; static int[] y = {5, 8, 10, 1, 3}; static int[] z = {8, 18, 12, 11, 23}; public static void main(String[] arg){ Mostrar m = new Mostrar(); /* Ordernar el vector x*/ m.imprime("Vector Original", x); Arrays.sort(x); m.imprime("Vector Ordenado", x); System.out.print("Los vectores son "); if(Arrays.equals(x,y)) System.out.println("iguales"); else System.out.println("diferentes"); } }

Extra: La biblioteca de clases de Java incluye una clase auxiliar llamada java.util.ArrayList que incluye como mtodos que se realizan ms a menudo con vectores (Cdigo 111) pero que permiten mezclas de tipos primitivos:

add(v) agrega un elemento a la lista. size() regresa el tamao de la lista. clear()Elimina el contenido de la lista. El tamao del vector es nulo despus de la operacin get(int i) Regresa el contenido del elemento i remove(int i) Elimina el elemento i

Cdigo 111. Ejemplo del uso de java.util.ArrayList 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: } } class Codigo110 { static int[] x = {5, 8, 10, 5, 3}; static int[] y = {5, 8, 10, 1, 3}; static int[] z = {8, 18, 12, 11, 23}; public static void main(String[] arg){ Mostrar m = new Mostrar(); /* Ordernar el vector x*/ m.imprime("Vector Original", x); Arrays.sort(x); m.imprime("Vector Ordenado", x); System.out.print("Los vectores son "); if(Arrays.equals(x,y)) System.out.println("iguales"); import java.util.Arrays; class Mostrar { void imprime( String mensaje, int x[] ) { int n = x.length; System.out.println(mensaje); for(int i = 0; i < n; i++) System.out.println( x[i]);

24: 25: 26: 27: 28: } }

else System.out.println("diferentes");

1.5. Class Vector

Los arrays en Java son suficientes para guardar tipos bsicos de datos, y objetos de una determinada clase cuyo nmero conocemos de antemano. Algunas veces deseamos guardar objetos en un array pero no sabemos cuantos objetos vamos a guardar. Una solucin es la de crear un array cuya dimensin sea ms grande que el nmero de elementos que necesitamos guardar. La clase Vector nos proporciona una solucin alternativa a este problema. Un vector es similar a un array, la diferencia estriba en que un vector crece automticamente cuando alcanza la dimensin inicial mxima. Adems, proporciona mtodos adicionales para aadir, eliminar elementos, e insertar elementos entre otros dos existentes.
A diferencia de un arreglo, un Vector es un tipo de objeto que permite almacenar objetos (referencias) de cualquier tipo, que adems de ofrecer estas facilidades; aparentemente este es un contenedor de Objetos ideal para toda situacin, sin embargo, su uso puede ser un poco deficiente ya que requiere mayor uso de memoria que un arreglo de Objetos

Uso de Vectores. Otro elemento que es ampliamente empleado en programacin es la utilizacin de listas de valores con determinados conceptos, esto es conocido como key-value lists y en el mundo Java recibe el nombre de "Hashtable", a continuacin se describe un ejemplo de "Hashtable's":

Uso de "Hashtables": Adems del uso de Vectores y "Hashtables", tambin existen otra serie de Clases para el almacenaje de Objetos, cada una de stas posee sus ventajas y desventajas para agrupar elementos comunes; mayores detalles sobre estas estructuras de datos estn fuera del alcance de este curso.

Algunos de los mtodos de la clase Vector son:

Vector (int

capacidad Inicial, int incremento).

Construye un vector

vaci con el tamao e incremento indicado.

add(int ndice, Object elemento). Inserta el objeto en la posicin ndice. elementAt(int ndice). Retorna el componente especificado por el ndice.

Cdigo 113. Ejemplo de la clase Vector. import java.util.Vector; class Empleado { public String nombre; public String direccion; public int numero; public Empleado(String nombre, String direccion, int numero) { this.nombre = nombre; this.direccion = direccion; this.numero = numero; } public void checaDatos() { System.out.println(); System.out.println("Empleado " + nombre + " " + direccion + " " + numero); } } public class Codigo112 { public static void main(String[] arg) { Vector empleados = new Vector(15, 10); final int MAXIMO = 20; System.out.println("Suma objetos Empleados al vector...");

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:

23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: } }

for(int i = 0; i < MAXIMO; i++) { Empleado e = new Empleado("N" + i, "D" + i, (int) (Math.random()* 200)); empleados.add(i, e); } for(int i = 0; i < MAXIMO; i++) { Empleado empleado empleados.elementAt(i); System.out.print("i = " + i + " "); empleado.checaDatos(); } System.out.println("El tamao del vector es " + empleados.size()); System.out.println("La capacidad del vector es " + empleados.capacity()); = (Empleado)

En la lnea 22 se declara un objeto de nombre empleados que tiene inicialmente 15 elementos, con incrementos de capacidad de 10. La lnea 26 crea una instancia de empleado, misma que sirve para agregar un elemento en la lnea 28. La lnea 32 crea una instancia de Empleado, empleado contiene los atributos y los mtodos de la clase Empleado.

1.6. Resumen de arreglos

Los arreglos se utilizan como contenedores para almacenar datos relacionados (en vez de declarar variables por separado para cada uno de los elementos del arreglo).

Todos los datos incluidos en el arreglo son del mismo tipo. Se pueden crear arreglos de enteros de tipo int o de reales de tipo float, pero en un mismo arreglo no se pueden mezclar datos de tipo int y datos de tipo float. A los elementos del arreglo se acceder a travs de la posicin que ocupan dentro del conjunto de elementos del arreglo. Los arreglos unidimensionales se conocen con el nombre de vectores. Los arreglos bidimensionales se conocen con el nombre de matrices. Cada arreglo tiene un campo length que contiene el nmero de elementos del arreglo en el momento que el programa crea el objeto arreglo. Un ndice puede ser un entero o una expresin entera (pero no de tipo long). Si un programa utiliza una expresin como ndice, el programa evala la expresin para determinar el elemento especfico del arreglo. La especificacin del lenguaje Java dice lo siguiente: Los arrays son objetos. La clase array es un ejemplar de una clase que hereda mtodos de la clase Object y sobreescribe el mtodo protected Object clone() throws CloneNotSupportedException de la misma clase para que un array pueda ser clonado. Adems, esta clase oculta proporciona un campo length. El siguiente listado demuestra la asociacin entre arrays y objetos:

1.1.6. Ejemplos Adicionales

1. Implementar el mtodo obtenerDeterminante de la clase Matriz n x m que almacena nmeros enteros. 2. Implementar el mtodo ponerBarco de la clase Tablero que se utiliza dentro de una aplicacin que implementa el juego de los barcos. El mtodo ponerBarco se utiliza al principio de cada partida y recibe como parmetros la longitud del barco, la posicin de comienzo y la orientacin (horizontal o vertical). 3. Crear la clase Melate que almacena una matriz de una sola dimensin de longitud n, siendo n el nmero de aciertos. Se pide implementar el mtodo hacerSorteo que simula el sorteo de la lotera n-primitiva rellenando los valores de la matriz con nmeros aleatorios entre 1 y 49 que no repetidos.

You might also like