You are on page 1of 13

ARRAYS EN JAVA

Nombre: Hugo Gabriel Ortega Fecha: 16-04-2013 El Lenguaje de Programacin JAVA maneja tambin los arreglos de manera bastante similar a como lo hacen los otros Lenguajes, pero con algunas diferencias. La ms importante es que en JAVA los arreglos son objetos. Un arreglo o matriz "es una estructura homognea, compuesta de varios elementos, todos del mismo tipo y almacenados consecutivamente en memoria. Cada elemento puede ser accedido directamente por el nombre de la variable matriz seguido de uno o ms subndices encerrados entre corchetes" [1]. Los arreglos son colecciones de datos de la misma naturaleza, en principio del mismo tipo primitivo. Sin embargo, se podra necesitar almacenar un conjunto de valores relacionados entre s pero que corresponden a diferentes tipos, por ejemplo, los miembros de una familia tienen nombres, apellidos, fecha de nacimiento, edad, una relacin de parentesco, etc. En estos casos JAVA permite crear un arreglo de objetos. Los arreglos pueden tener dimensiones. Los ms comunes son los de una dimensin, o sea, lo que tienen un slo subndice y que se llaman normalmente "listas". A los que tienen dos dimensiones, con dos subndice, se les denomina comnmente "tablas". Arreglos Unidimensionales Una matriz o arreglo unidimensional puede contener elementos que pueden ser tipos primitivos o una referencia a objetos. Para manipular los arreglos deben primero declararse y despus crearse e inicializarse. Se declara utilizando una variable que sea del mismo tipo de dato que los elementos de la coleccin. El formato es : tipo[] nombreVariable; Tambin, dependiendo del estilo del programador, se puede utilizar otro formato : tipo nombreVariableArreglo[];

Donde "tipo" es el tipo de dato del arreglo, sea un tipo de dato primitivo o una referencia a objeto. El "nombreVariable" ser la referencia que nos permitir acceder al arreglo y a sus elementos La nica diferencia entre los dos formatos es la posicin de los corchetes. Estos sirven pues le indican al compilador que se trata de un arreglo para que le reserve espacio en memoria. Para crear el arreglo se utiliza el operador "new", pues estamos creando un objeto nuevo. Adems, se debe indicar el tamao de la matriz, lo que se debe hacer con un literal entero positivo o con alguna variable entera del programa, tambin mayor que cero (0). El formato es : nombreVariableArreglo = new tipo[tamao]; Se estila a declarar y crear el arreglo en una sola lnea : tipo[] nombreVariableArreglo = new tipo[tamao]; Algunos ejemplos : int vector[] = new int[5]; //vector de cuatro posiciones int[] vector = new int[5]; //Idem int[] vector; //se declara vector = new int[4]; //se crea byte tamao; miFamilia[] familia; familia = new miFamilia[tama];

Grficamente, en memoria tendramos:

Una vez creada la matriz se pueden almacenar y manipular los datos. El arreglo es llenado automticamente con valores dependiendo del tipo de dato que se emplea. Si se trata de tipos numricos se inicializan con un 0. Si se trata de caracteres se

llenan con '\0' . Si son elementos booleanos se inicializan con false. Y si son tipos referenciados, o sea objetos, con el valor null, que es un objeto especial que denota o significa objeto vaco. Por otro lado, siempre es posible inicializar con valores los elementos de la coleccin: String[] nombres = {"juan","diego","pedro"};

Se crea un arreglo de objetos String con tres elementos inicializados. En JAVA, la primera posicin del arreglo tiene por subndice siempre el valor entero cero (0). En los ejemplos, el arreglo "nombres" tiene tres posiciones que parten desde el 0 hasta el 2. De manera que, para el manejo de los elementos los subndices tienen un valor mximo del tamao del arreglo menos 1. Si se tratar de acceder a valores u objetos fuera de los lmites del arreglo, ya sea con un literal entero negativo menor que 0 o con un literal entero positivo mayor que el tamao del arreglo menos 1, se producir un error que dar lugar a la excepcin ArrayIndexOutOfBoundsException(). Para no tener problemas podemos consultar el largo del arreglo, si no lo conocemos, a travs de la variable esttica "lenght", que es la nica que aceptan las matrices. arregloEnteros.java 13 14 15 + "\n"); int largo; largo = n.length; System.out.println("\nEl largo del vector es : " + largo

La estructura para manejar los arreglos es bastante conocida. La podemos observar en el siguiente ejemplo : arregloEnteros.java 19 20 21 int i; for (i = 0 ; i < n.length; i++) System.out.print(n[i] + " ");

Para acceder a los valores de los elementos del arreglo se usa el nombre de la variable que hace referencia a la matriz y el subndice que identifica al elemento. Por ejemplo : String[] nombres = {"juan","diego","pedro"}; System.out.println(nombres[1]); //imprime diego

Cuando se est asignando un valor por primera vez en una posicin del arreglo se crea automticamente un objeto del tipo primitivo correspondiente o una instancia del tipo de clase de los objetos que va a referenciar. Y cuando se copia un valor dentro del arreglo lo que sucede es que se cambia la referencia reemplazndola con el nuevo objeto. Por ejemplo: arregloEnteros.java 1 /* fuente : arregloEnteros.java*/ 2 /* Crea arreglos enteros y los manipula */ 3 4 class arregloEnteros 5{ 6 public static void main (String[] args) 7 { 8 int[] n = {10,20,30,40,50}; 9 10 n[1] = n[4]; 11 System.out.println(n[1]); //imprime 50. Se cambia el objeto referenciado

Existen dos mtodos, heredados de la clase Object que son interesantes de considerar en el tema de los arreglos: clone y equals. Con clone se puede duplicar la matriz, es decir, crear otro arreglo con el mismo contenido. El mtodo equals permite determinar si las variables hacen referencia al mismo objeto, en este caso, al mismo arreglo. Por ejemplo: arregloCE.java 1 /* fuente : arregloCE.java*/ 2 /* Uso de mtodos clone y equals */

3 4 class arregloCE 5{ 6 public static void main (String[] args) 7 { 8 int[] arreglo = {10,20,30,40,50}; 9 int[] copia = (int[])arreglo.clone(); 10 11 if (arreglo.equals(copia)) 12 System.out.println("Son la misma matriz" ); 13 14 os"); 15 16 17 18 19 20 21 22 23 24 } copia = arreglo; if (arreglo.equals(copia)) System.out.println("Son la misma matriz"); else System.out.println("Son arreglos distintos"); } else System.out.println("Son arreglos distint

En lnea 9 se declara el arreglo "copia" y se inicializa referencindolo al mismo arreglo apuntado por la variable "arreglo", con el mtodo clone. En la lnea 11, se comparan ambas referencias y se pregunta si apuntan al mismo arreglo; en este caso, la operacin devuelve "false" pues son arreglos distintos. Para que referenciaran al mismo arreglo hubiera sido necesario una sentencia como : copia = arreglo, como se ve a partir de la lnea 17. Arreglos Multidimensionales La verdad es que JAVA no maneja los arreglos con ms de un subndice. Sin embargo, se pueden construir creando arreglos de arreglos, segn cuantas dimensiones se necesiten. Los arreglos multidimensionales pueden llevar dos subndices (tablas) o ms. Los subndice de las tablas representan dos parmetros: filas y columnas. Pueden llevar ms subndice pero ello depende de los lmites establecidos por el compilador y de la disponibilidad de memoria para trabajarlos.

Los arreglos multidimensionales se declaran, crean y se llenan de la misma manera que los unidimensionales, slo que esta vez se usan dos pares de corchetes. Por ejemplo : Point malla[][] = new Point[15][20]; int[][] multi = new int[2][4]; En el caso de las matrices multidimensionales, como ya lo sealamos, cada elemento declarado es una referencia a otra matriz. Por ejemplo : arregloMulti.java 1 /* fuente : arregloMulti.java*/ 2 /* Crea arreglo multidimensional */ 3 4 class arregloMulti 5{ 6 public static void main (String[] args) 7 { 8 int[][] multi = new int[3][5]; 9 10 System.out.println(multi.length); //imprime 3 11 System.out.println(multi[0].length); //imprime 5 12 System.out.println(multi[1].length); //imprime 5 13 14 15 } 16 }

En este pequeo programa preguntamos a cerca del tamano de las matrices de la tabla. Grficamente en memoria tendramos :

Sin embargo, una mejor representacin de la tabla nos permitir reconocer mejor filas y columnas :

Arreglo de Objetos En este caso, se trata de colecciones de tipos de datos definidos por el programador o que forman parte de la API JAVA y que son referenciados desde el arreglo. Cuando se crea un arreglo de objetos en JAVA, no se crean automticamente los objetos. Lo que se sucede es que el arreglo contiene referencias a objetos y el programa debe crearlos por su cuenta y asignarlos. Recordemos que el valor por defecto de estas referencias es "null" Para ejemplificar utilizaremos la clase miFamilia y crearemos una clase objeto aplicacin, que llamaremos arregloFamilia, a travs de la cual crearemos el arreglo y controlaremos el flujo del programa.

1 /*fuente : arregloFamilia.java*/ 2 /*Objeto Aplicacin para clase miFamilia*/ 3 4 import java.io.*; 5 6 class arregloFamilia 7{ 8 static miFamilia f[]; 9 static byte tamao; 10 11 public static void main (String args[]) 12 { 13 byte i; 14 String ingreso = ""; 15 //definicin de flujo de entrada 16 InputStreamReader puente = new InputStreamReader(System.in); 17 BufferedReader flujoEntrada = new BufferedReader(puente);

Esta es la primera parte del programa. En ella existen varias cosas interesantes. En la lnea 4, se importa un paquete que contiene los objetos necesarios para el control del flujo de Entrada/Salida estndar. Se declara el arreglo que va a contener los datos de los miembros de la familia como esttico, es decir, va existir uno solo para el programa y para todos los objetos que de l deriven y para todos los mtodos del objeto aplicacin; lo mismo para el atributo "tamao". Este atributo "tamao", nos va a determinar la capacidad del arreglo, el cual se ingresa por teclado. Y se define el flujo de entrada. 19 20 21 22 23 24 25 26 27 28 29 incorrecto"); 30 31 32 33 //Si se ingres con argumentos try { if (args[0] != null) try { tamao = Byte.parseByte(args[0]); } catch (NumberFormatException ee) { System.out.println("Tamao de arreglo ingreTam(); } }

34 35 36 37

catch (ArrayIndexOutOfBoundsException e) { ingreTam(); }

Estas lneas tienen por objeto verificar cuando se ha corrido la aplicacin con argumentos, por ejemplo : $ java arregloFamilia 4. En este caso, tenemos un argumento en la lnea de comandos que se almacena en la primera posicin del arreglo "args" (args[0]), y que corresponde al nmero de integrantes de la familia en cuestin que se usa para declarar y crear el arreglo de objetos miFamilia. En la lnea 22, se consulta si "args[0]" hace referencia a un objeto String; si es as se convierte la cadena a un tipo Byte para determinar el tamao del arreglo. Se hace el control de excepciones con la clase ArrayIndexOutOfBoundsException que tiene por objeto verificar si se ha accedido al arreglo del bloque try en forma ilegal (con ndice negativo, superior o igual a su tamao a un arreglo inexistente). En caso de producirse la excepcin, y como no sabemos la capacidad del arreglo, se llama a un mtodo, denominado "ingreTam()", que tiene por funcin solicitar que se ingrese el tamao desde el teclado por el usuario. Puede suceder que cuando se ingrese el tamao por la lnea de comandos se produzca un error, como ingresar una letra en vez de un nmero. En este caso, se usa la excepcinNumberFormatException que controla errores cuando se trata de convertir cadenas a valores numricos. Producido el caso se llama al mtodo "ingreTam()". En todo caso, el programa siempre puede terminar pulsando las taclas "Crtl + z" o "Crtl + c". 39 40 41 //crea el objeto f = new miFamilia[tamao]; //System.out.println(f.length);

En este caso, conocido el tamao del arreglo se procede a su creacin. 43 44 45 46 47 48 49 //Ingreso de datos String p = ""; String n =""; byte e = 0; String a = ""; for (i = 0; i < f.length ; i++)

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

{ try { //debe ingresar padre, madre o hijo o hija System.out.print("\nEscriba el parentesco : "); p = flujoEntrada.readLine(); } catch (IOException error) { } //Ingreso de datos comunes : nombre, edad try { System.out.print("Escriba el nombre : "); n = flujoEntrada.readLine(); } catch (IOException error) { } try { System.out.print("Escriba la edad : "); ingreso = flujoEntrada.readLine(); try{ e = Byte.parseByte(ingreso); } catch (NumberFormatException er) { System.out.println("Error ingreso de eda i--; continue; } } catch (IOException error) { }

d");

Este bloque de cdigo, contiene toda la secuencia de entrada de datos a la aplicacin. Para lo cual se hace uso de la excepcin IOExeption para el control del flujo de Entrada/Salida. Por ltimo, destacar que si se producen errores al ingresar la edad se salta al siguiente ciclo del bucle pero disminuyendo en una unidad la variable que controla el ndice (lneas 81 y 82).

89 //creacin de objetos del arreglo 90 if (p.equals("hijo") || p.equals("hija")) 91 { 92 //crea y asigna referencia 93 f[i] = new miFamilia(n, e, p); 94 } 95 else 96 if (p.equals("padre") || 97 p.equals("madre")) 98 { 99 //Ingresa apellido materno 100 try 101 { 102 System.out.print("Escriba el apellido materno : "); 103 a = flujoEntrada.readLine(); 104 } 105 catch (IOException error) 106 { 107 } 108 109 f[i] = new miFamilia(n, e, p ,a); 110 } 111 else 112 { 113 System.out.println("Parentesco No vlido. Ingrese : padre, madre o hijo"); 114 //elimar la referencia 115 i--; 116 } 117 118 }

Con este cdigo termina el bucle for que se vimos en el anterior apartado. Tiene por objetivo crear los objetos a lo que se hace referencia desde el arreglo, conforme a los mtodos contructores de la clase miFamilia discriminando si se ingresa un padre o madre o algn hijo. Se controla el ingreso correcto de la cadena dal parentesco a partir de la lnea 96. 119 120 121 122 123 124 System.out.println("\n\n La Familia est compuesta por :"); imprimir(); } //del main //Mtodo imprimir arreglo

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

static void imprimir() { int i; for (i = 0; i < f.length ; i++) { if (f[i].parentesco.equals("padre")) System.out.println(f[i].parentesco + " " + f[i].nombre + " " + f[i].apellidoPaterno + " " + f[i].apellido + " " + f[i].edad + " aos."); else if (f[i].parentesco.equals("madre")) System.out.println(f[i].parentesco + " " + f[i].nombre + " " + f[i].apellidoMaterno + " " + f[i].apellido + " " + f[i].edad + " aos."); else //hijos System.out.println(f[i].parentesco + " " + f[i].nombre + " " + f[i].apellidoPaterno + " " + f[i].apellidoMaterno + " " + f[i].edad + " aos."); } }

Finalmente, el mtodo "main" termina llamando a la funcin "imprimir()", que se muestra desde la lnea 125 y que discrimina al padre de la madre y de los hijos para dar a conocer los datos. 154 static void ingreTam() 155 { 156 String ingre = ""; 157 //definicin de flujo de entrada 158 InputStreamReader pte = new InputStreamReader(System.in); 159 BufferedReader flujoE = new BufferedReader(pte); 160 161 boolean siga = true; 162 while (siga) 163 try 164 {

165 166 167 168 169 170 171 172 173 174 incorrecto"); 175 176 177 178 179 180 181 182 183 } 184 185 } //de la

System.out.print("Escriba el tamao de su familia : "); ingre = flujoE.readLine(); try { siga = false; tamao = Byte.parseByte(ingre); } catch (NumberFormatException ee) { System.out.println("Tamao de arreglo siga = true; } } catch (IOException error) { System.out.println(error); }

clase

Por ltimo, para terminar con la clase "arregloFamilia", se muestra "ingreTam()" que sirve para ingresar la capacidad del arreglo desde el teclado. Se podra haberhecho que el mtodo devolviera un valor Byte con el tamao, pero se prefiri usar el atributo de clase "tamao" en haras de no duplicar variables en memoria que cumplen la misma funcin. (Ceballos)

Trabajos citados
Ceballos, F. J. (s.f.). 50MEGS. Recuperado el 16 de Abril de 2013, de http://www.juanabe.50megs.com/webJuanabe/mem/cap1-16.html

You might also like