Download ARREGLOS Y COLECCIONES EN JAVA
Document related concepts
no text concepts found
Transcript
ARREGLOS Y COLECCIONES EN JAVA ESTRUCTURA DE CONTENIDOS 1. ¿PARA QUÉ USAR ARREGLOS? 1.1 1.2 1.3 2. Enunciado del Problema. Análisis del Problema. Solución al problema con el uso de arreglos. DECLARACIÓN, CREACIÓN Y USO DE ARREGLOS 2.1 2.2 2.3 3. Sintaxis para declarar y crear un arreglo. Recorrido de un arreglo. Arreglos de Objetos. COLECCIONES Y GENERICS 3.1 3.2 3.3 3.4 3.5 3.6 Tipos de Colecciones y Características. Uso de la colección ArrayList. Uso de la colección LinkedList. Uso de la colección HashSet. Uso de la colección TreeSet. Los generics y las colecciones. 1 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA MAPA CONCEPTUAL 2 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA INTRODUCCIÓN Frecuentemente las aplicaciones informáticas requieren manejar conjuntos de datos comunes en memoria para su posterior consulta o procesamiento, por ejemplo los nombres de los empleados de una empresa o los precios de los artículos de un almacén. Este almacenamiento de datos en memoria se puede llevar a cabo a través de estructuras de programación como los arreglos o las colecciones. El uso de arreglos y colecciones es fundamental para la solución de problemas a través de aplicaciones de software y este es el principal propósito del presente Objeto de Aprendizaje. 1. ¿PARA QUÉ USAR ARREGLOS? Los arreglos son estructuras de almacenamiento en memoria que permiten llevar a cabo la lectura, el procesamiento o consulta de conjuntos de datos dentro de una aplicación de software. Este recurso es de uso común entre los desarrolladores de software, pero para entender mejor su utilidad, a continuación se presenta un enunciado de un problema donde se requiere el uso de arreglos. 1.1 Enunciado del problema. “Determinar la cantidad de empleados de una empresa que ganan un salario superior al salario promedio de todos los empleados de la empresa”. 3 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 1.2 Análisis del problema. Fácilmente se puede deducir que el problema se debe descomponer en 2 partes: 1 2 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 Se debe determinar cuántos empleados ganan un salario superior al salario promedio anteriormente calculado. Se requiere calcular el salario promedio de los empleados de la empresa. import javax.swing.JOptionPane; public class Programa1 { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double sumSalario=0,salario,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); for(int i=1;i<=totalEmpleados;i++) { salario=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario; } salarioPromedio=sumSalario/totalEmpleados; //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=1;i<=totalEmpleados;i++) { //???????????????? } } } El programa anterior calcula correctamente el salario promedio de todos los empleados de la empresa (punto 1 del análisis), pero ¿cómo determinar cuántos de esos empleados ganan un salario superior al salario promedio?(punto 2 del análisis) 4 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 1 Primer Intento 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 Se debe determinar cuántos empleados ganan un salario superior al salario promedio anteriormente import javax.swing.JOptionPane; public class Programa1A { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double sumSalario=0,salario=0,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); for(int i=1;i<=totalEmpleados;i++) { salario=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario; } salarioPromedio=sumSalario/totalEmpleados; x //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=1;i<=totalEmpleados;i++) { if(salario > salarioPromedio) { cantEmplSalSuperior++; } } La solución propuesta es equivocada porque el salario de cada empleado es leído en la misma variable salario en la línea 14 del programa, por lo tanto, en la línea 22 del programa, el valor que se tiene en la variable salario es el salario del último empleado solamente, los salarios de los empleados anteriores se han perdido. Una pequeña prueba de escritorio muestra como el valor de la variable salario es actualizado cada vez que se lee un nuevo salario. i Salario 1 2 3 4 5 6 1200000 1500000 950000 800000 1100000 7800000 5 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 2 Segundo Intento 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 Se requiere calcular el salario promedio de los empleados de la empresa. import javax.swing.JOptionPane; public class Programa1B { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double sumSalario=0,salario,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); for(int i=1;i<=totalEmpleados;i++) { salario=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario; } salarioPromedio=sumSalario/totalEmpleados; //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=1;i<=totalEmpleados;i++) { salario=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); if(salario > salarioPromedio) { cantEmplSalSuperior++; } } x } } La segunda solución propuesta incluye en la línea 22 un nuevo código que permite leer nuevamente el salario de cada empleado. Esta propuesta es equivocada porque el salario de cada empleado ya había sido leído en la línea 14 del programa. Esta solución además del doble trabajo que significa leer en 2 oportunidades el salario de cada empleado, es insegura, ya que al volver a leer el salario de cada empleado, el usuario podría ingresar salarios diferentes a los usados para calcular el salario promedio. 5 6 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 1.3 SOLUCIÓN AL PROBLEMA CON EL USO DE ARREGLOS. La segunda solución propuesta incluye en la línea 22 un nuevo código que permite leer nuevamente el salario de cada empleado. Esta propuesta es equivocada porque el salario de cada empleado ya había sido leído en la línea 14 del programa. Esta solución además del doble trabajo que significa leer en 2 oportunidades el salario de cada empleado, es insegura, ya que al volver a leer el salario de cada empleado, el usuario podría ingresar salarios diferentes a los usados para calcular el salario promedio. i 1 2 3 4 5 6 Salario 1200000 1500000 950000 800000 1100000 7800000 SalarioPromedio cantEmplSalSup 1055000 3 Los arreglos permiten realizar el almacenamiento de un conjunto de valores en posiciones de memoria diferentes para que cada valor pueda ser accedido en cualquier momento durante la ejecución de un programa. La solución al problema consiste en definir un arreglo para almacenar los diferentes salarios de los empleados de la empresa, a partir de ellos calcular el salario promedio y posteriormente acceder al arreglo de salarios para determinar cuántos de ellos son superiores al salario promedio. 7 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA SOLUCIÓN FINAL USANDO UN ARREGLO 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 import javax.swing.JOptionPane; public class Programa1Final { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double salario[];//Declaración del arreglo de Salarios double sumSalario=0,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); salario= new double[totalEmpleados];//Creación del arreglo de Salarios for(int i=0;i<totalEmpleados;i++) { //Lectura de cada posición (i) del arreglo (en cada posición se almacena un salario diferente salario[i]=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario[i]; } salarioPromedio=sumSalario/totalEmpleados; JOptionPane.showMessageDialog(null, "El salario promedio es "+salarioPromedio); //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=0;i<totalEmpleados;i++) { //Uso del arreglo de salarios, previamente cargado en la línea 18 if(salario[i] > salarioPromedio) { cantEmplSalSuperior++; } } JOptionPane.showMessageDialog(null, "El numero de empleados con salario superior al promedio es "+cantEmplSalSuperior); } } 5 8 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA Ejecución del programa: Ingrese cantidad de empleados 6 Aceptar Ingrese Salario de empleados 1200000 Aceptar Ingrese Salario de empleados 1500000 Aceptar Ingrese Salario de empleados 950000 Aceptar Ingrese Salario de empleados 800000 Aceptar Ingrese Salario de empleados 1100000 Aceptar El salario promedio es 1055000.0 Aceptar Ingrese Salario de empleados 780000 Aceptar El numero de empleados con salarios superior al promedio es 3 Aceptar 9 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 2. DECLARACIÓN, CREACIÓN Y USO DE ARREGLOS 2.1 Sintaxis para declarar y crear un arreglo. La declaración de un arreglo es similar a la declaración de una variable, la sintaxis es la siguiente: tipoDato nombreArreglo[ ]; Ejemplos: int edad[ ]; Declaración de un arreglo de enteros llamado edad float nota[ ]; Declaración de un arreglo de reales llamado nota String nombre[ ]; Declaración de un arreglo de cadenas llamado nombre En el ejercicio anteriormente resuelto, se aprecia la declaración de un arreglo de tipo doublé llamado salario: 10 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 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 import javax.swing.JOptionPane; public class Programa1Final { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double salario[];//Declaración del arreglo de Salarios double sumSalario=0,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); salario= new double[totalEmpleados];//Creación del arreglo de Salarios for(int i=0;i<totalEmpleados;i++) { //Lectura de cada posición (i) del arreglo (en cada posición se almacena un salario diferente salario[i]=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario[i]; } salarioPromedio=sumSalario/totalEmpleados; JOptionPane.showMessageDialog(null, "El salario promedio es "+salarioPromedio); //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=0;i<totalEmpleados;i++) { //Uso del arreglo de salarios, previamente cargado en la línea 18 if(salario[i] > salarioPromedio) { cantEmplSalSuperior++; } } JOptionPane.showMessageDialog(null, "El numero de empleados con salario superior al promedio es "+cantEmplSalSuperior); } } Después de declarar un arreglo, este debe crearse, para ello se usa la palabra reservada new y se define la cantidad de posiciones que el arreglo puede contener para el almacenamiento de valores. Sintaxis: Arreglo = new TipoDato[tamaño]; 11 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA Ejemplos: · · · edad = new int [10]; Creación del arreglo edad con 10 posiciones nota = new float [15]; Creación del arreglo nota con 15 posiciones nombre = new String [5]; Creación del arreglo nombre con 5 posiciones En el ejercicio anteriormente resuelto, se aprecia la creación de un arreglo llamado salario de una cantidad de posiciones definida por la variable totalEmpleados: 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 import javax.swing.JOptionPane; public class Programa1Final { public static void main(String arg[]) { //1. Calcular el salario promedio de los empleados double salario[];//Declaración del arreglo de Salarios double sumSalario=0,salarioPromedio; int totalEmpleados, cantEmplSalSuperior=0; totalEmpleados=Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese cantidad de empleados")); salario= new double[totalEmpleados];//Creación del arreglo de Salarios for(int i=0;i<totalEmpleados;i++) { //Lectura de cada posición (i) del arreglo (en cada posición se almacena un salario diferente salario[i]=Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese salario del empleado")); sumSalario=sumSalario+salario[i]; } salarioPromedio=sumSalario/totalEmpleados; JOptionPane.showMessageDialog(null, "El salario promedio es "+salarioPromedio); //2. Determinar cuántos empleados ganan un salario superior al promedio for(int i=0;i<totalEmpleados;i++) { //Uso del arreglo de salarios, previamente cargado en la línea 18 if(salario[i] > salarioPromedio) { cantEmplSalSuperior++; } } JOptionPane.showMessageDialog(null, "El numero de empleados con salario superior al promedio es "+cantEmplSalSuperior); } } La primera posición de un arreglo en Java es la posición 0 y la última es n-1, donde n es el tamaño del arreglo. 12 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA En Java también es posible declarar y crear un objeto en la misma línea de código, ejemplo: int edad [ ] = new int [10]; Declaración y creación de un arreglo llamado edad de 10 posiciones de tipo entero. floatnota [ ] = new float [15]; Declaración y creación de un arreglo llamado nota de 15 posiciones de tipo float. String nombre [ ] = new String [5]; Declaración y creación de un arreglo llamado nombre de 5 posiciones de tipo String. El siguiente ejemplo muestra la declaración, creación, inicialización y consulta de un arreglo llamado edad de 5 posiciones de tipo entero: public class Programa2 { public static void main(String arg[]) { int edad[]= new int[5]; edad[0]=18; edad[1]=20; edad[2]=15; edad[3]=35; edad[4]=53; for(int i=0;i<5;i++) { System.out.println("El valor del arreglo edad en la posicion "+i+" es "+edad[i]); } } } Al ejecutar el programa, el resultado es el siguiente: 13 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA También es posible inicializar un arreglo en la misma línea donde es declarado y creado. El siguiente ejemplo declara, crea e inicializa en la misma línea de código un arreglo de 5 posiciones de tipo cadena con los nombres de 5 personas diferentes, posteriormente se imprime el contenido del arreglo: public class Programa3 { public static void main(String arg[]) { String nombre[]={"Juan","Pedro","Luis","Lina","Diana"}; for(int i=0;i<5;i++) { System.out.println(nombre[i]); } } } Al ejecutar el programa, el resultado es el siguiente: 14 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 2.2 Recorrido de un arreglo. Como se ha visto anteriormente, el recorrido de un arreglo requiere de un ciclo para pasar por cada una de sus posiciones; en el programa anterior, se aprecia el uso del ciclo for para acceder a todas las posiciones del arreglo nombres. public class Programa3 { public static void main(String arg[]) { String nombre[]={"Juan","Pedro","Luis","Lina","Diana"}; for(int i=0;i<5;i++) { System.out.println(nombre[i]); } } } Pero ¿qué podría ocurrir al intentar acceder a una posición inexistente de un arreglo?. Este es un error común en programación, veamos el siguiente ejemplo: public class Programa3A { public static void main(String arg[]) { String nombre[]={"Juan","Pedro","Luis","Lina","Diana"}; for(int i=0;i<=5;i++) { System.out.println(nombre[i]); } } } 15 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA El arreglo anterior es de 5 posiciones, las cuales están comprendidas desde la posición 0 hasta la posición 4. Al intentar acceder la posición 5 del arreglo, se lanzará una excepción de tipo ArrayIndexOutOfBoundsException Afortunadamente existe una forma más segura de recorrer un arreglo, esta es utilizando un ciclo especial conocido como el ciclo for each. Sintaxis: for (TipoDato variable : Arreglo) · Permite recorrer todas las posiciones del arreglo, a través de la variable Ejemplo: for (Stringx : nombre) · Recorre todas las posiciones del arreglo nombre a través de la variable x El ejercicio anterior, puede ser modificado para realizar el recorrido del arreglo de manera segura mediante el uso del ciclo for each: 16 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA public class Programa3A { public static void main(String arg[]) { String nombre[]={"Juan","Pedro","Luis","Lina","Diana"}; for(String x: Nombre) { System.out.println(x); } } } Al ejecutar el programa, el resultado es el siguiente: 2.3 Arreglos de Objetos. 17 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 2.3 Arreglos de Objetos. De la misma manera como se declaran, crean, inicializan y acceden los arreglos de tipos de datos primitivos se hace con los arreglos de objetos. De hecho el arreglo de tipo String es un arreglo de objetos. Pero para entender mejor este aspecto, vamos a implementar un programa que cree un arreglo de objetos asociados a una clase personalizada. El siguiente es el código de la clase Alumno: public class Alumno { private String nombre; private double nota; public Alumno(String nombre,double nota) { this.nombre=nombre; this.nota=nota; } public String getNombre() { return nombre; } public double getNota() { return nota; } } 18 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA El programa 4, muestra la manera de crear un arreglo de objetos de la clase Alumno y su respectivo procesamiento: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Programa4 { public static void main(String arg[]) { Alumno estudiante[]=new Alumno[3]; estudiante[0]=new Alumno("Andres",3.5); estudiante[1]=new Alumno("Julian",5); estudiante[2]=new Alumno("Fabian",4.2); for(Alumno al:estudiante) { System.out.println("El alumno "+al.getNombre()+" obtuvo una nota de "+al.getNota()); } } } Linea 5 : Declaración y creación de un arreglo de 3 posiciones de tipo Alumno Linea 6,7,8 : Declaración y creación de un arreglo de 3 posiciones de tipo Alumno Linea 10 : Configuración del ciclo for each para recorrer todas las posiciones del arreglo de tipo Alumno llamado estudiante a través de una variable llamada al Linea 12 : Acceso a los métodos de cada objeto almacenado en el arreglo Al ejecutar el programa, se obtiene el siguiente resultado: 19 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.0 COLECCIONES Y GENERICS Los arreglos son una excelente herramienta de programación, principalmente cuando la cantidad de posiciones del mismo se mantiene constante, sin embargo, al momento de incluir más elementos dentro de un arreglo o al momento de querer eliminar posiciones del mismo, los arreglos son ineficientes. En Java existen otras estructuras de almacenamiento conocidas como colecciones. Una colección permite almacenar información en memoria de manera dinámica, es decir, permite el aumento o disminución del tamaño de la colección de acuerdo con la necesidad de la aplicación. 3.1 Tipos de Colecciones y Características. COLLECTION List ArrayList Set LinkedList HashSet TreeSet 20 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA ELEMENTO TIPO DESCRIPCION Collection Interfaz Define un conjunto de métodos comunes a las demás interfaces o clases que se derivan de la interfaz Collection. List Interfaz Maneja de manera ordenada los elementos introducidos de acuerdo con el orden de inserción. Permite elementos duplicados. Set Interfaz Colección desordenada de objetos. No permite elementos duplicados Clase Clase concreta que implementa la interfaz List, esta clase se basa en un arreglo dinámico. Permite un acceso rápido a los elementos de la colección, pero es lenta para la inserción o eliminación de objetos. ArrayList LinkedList HashSet TreeSet Clase Clase concreta que implementa la interfaz List, esta clase se basa en una lista enlazada. Es muy útil cuando la cantidad de elementos de la colección es muy variable. El acceso a un elemento particular de la colección es más lento. Clase Clase concreta que implementa la interfaz Set. Los elementos de esta clase no permiten duplicados y no se almacenan en orden no determinado. Clase Clase concreta que implementa la interfaz Set. Los elementos de esta clase no permiten duplicados y sus elementos se ordenan de manera ascendente. Para usar cualquier elemento de la API de Colecciones, se debe implementar el paquete java.util 21 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.2 Uso de la clase ArrayList. Para comprender mejor el uso de la clase ArrayList, se presenta el siguiente ejemplo: import java.util.ArrayList; public class TestArrayList { public static void main(String arg[]) { //Crea, llena e imprime una lista con números ArrayList listaNums= new ArrayList(); listaNums.add(8); listaNums.add(3); listaNums.add(5); listaNums.add(2); listaNums.add(3); System.out.println("Lista de numeros: "+listaNums); //-----------------------------------------//Crea, llena e imprime una lista con nombres ArrayList listaNombres= new ArrayList(); listaNombres.add("Juan"); listaNombres.add("Pedro"); listaNombres.add("Carlos"); listaNombres.add("Daniel"); listaNombres.add("Carlos"); System.out.println("Lista de nombres:"+listaNombres); //-----------------------------------------//Obtener un elemento particular de la lista System.out.println("Numero posicion 2:"+listaNums.get(2)); System.out.println("Nombre posicion 0:"+listaNombres.get(0)); //Reemplazar un elemento de la lista listaNums.set(0,15); listaNombres.set(0,"Claudia"); //Las listas quedan así: System.out.println("Lista de numeros: "+listaNums); System.out.println("Lista de nombres:"+listaNombres); } } La clase ArrayList está basada en un arreglo dinámico y permite gestionar su contenido a través de posiciones específicas. Por implementar la interfaz List, el almacenamiento de sus datos se da de acuerdo con el orden de inserción y permite los elementos repetidos. 22 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.3 Uso de la clase LinkedList. Para comprender mejor el uso de la clase LinkedList, se presenta el siguiente ejemplo: import java.util.LinkedList; public class TestLinkedList { public static void main(String arg[]) { //Crea, llena e imprime una lista con números LinkedList listaNums= new LinkedList(); listaNums.add(8); listaNums.add(3); listaNums.add(5); listaNums.add(2); listaNums.add(3); //Insertar un nuevo dato al inicio de la lista listaNums.addFirst(10); System.out.println("Lista de numeros: "+listaNums); //-----------------------------------------//Crea, llena e imprime una lista con nombres LinkedList listaNombres= new LinkedList(); listaNombres.add("Juan"); listaNombres.add("Pedro"); listaNombres.add("Carlos"); listaNombres.add("Daniel"); listaNombres.add("Carlos"); //Insertar un nuevo dato al inicio de la lista listaNombres.addFirst("Julian"); System.out.println("Lista de nombres:"+listaNombres); //-----------------------------------------//Obtiene y remueve el primer elemento de la lista System.out.println("Elemento removido:"+listaNums.poll()); System.out.println("Elemento removido:"+listaNombres.poll()); //Las listas quedan así: System.out.println("Lista de numeros: "+listaNums); System.out.println("Lista de nombres:"+listaNombres); } } La clase LinkedList está basada en una lista doblemente enlazada, en la que se conoce cuál es el primer elemento y último elemento de la lista, por esta razón, se facilitan las operaciones que se hacen al principio o al final de la lista como la inserción o eliminación de elementos. Por implementar la interfaz List, el almacenamiento de sus datos se da de acuerdo con el orden de inserción y permite los elementos repetidos. 23 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.4 Uso de la claseHashSet. Para comprender mejor el uso de la clase HashSet, se presenta el siguiente ejemplo: import java.util.HashSet; public class TestHashSet { public static void main(String arg[]) { //Crea, llena e imprime una lista con números HashSet listaNums= new HashSet(); listaNums.add(8); listaNums.add(3); listaNums.add(5); listaNums.add(2); listaNums.add(3); System.out.println("Lista de numeros: "+listaNums); //-----------------------------------------//Crea, llena e imprime una lista con nombres HashSet listaNombres= new HashSet(); listaNombres.add("Juan"); listaNombres.add("Pedro"); listaNombres.add("Carlos"); listaNombres.add("Daniel"); listaNombres.add("Carlos"); System.out.println("Lista de nombres:"+listaNombres); //-----------------------------------------//Remueve un elemento de la lista listaNums.remove(5); listaNombres.remove("Pedro"); //Las listas quedan así: System.out.println("Lista de numeros: "+listaNums); System.out.println("Lista de nombres:"+listaNombres); } } La clase HashSetbasa la organización de sus elementos en un algoritmo especial, mediante el cual, cada elemento posee una clave o identificador no manipulable a través del cual se realiza el ordenamiento y búsqueda de los elementos de la colección. Por esta razón el orden de los elementos almacenados en la colección es indeterminado. Al implementar la interfaz Set, la clase HashSet tiene la característica de no permitir elementos duplicados. 24 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.5 Uso de la clase TreeSet. Para comprender mejor el uso de la clase TreeSet, se presenta el siguiente ejemplo: import java.util.TreeSet; public class TestTreeSet { public static void main(String arg[]) { //Crea, llena e imprime un conjunto con números TreeSet listaNums= new TreeSet(); listaNums.add(8); listaNums.add(3); listaNums.add(5); listaNums.add(2); listaNums.add(3); System.out.println("Lista de numeros: "+listaNums); //-----------------------------------------//Crea, llena e imprime un conjunto con nombres TreeSet listaNombres= new TreeSet(); listaNombres.add("Juan"); listaNombres.add("Pedro"); listaNombres.add("Carlos"); listaNombres.add("Daniel"); listaNombres.add("Carlos"); System.out.println("Lista de nombres:"+listaNombres); //-----------------------------------------//Elementos mayores a un elemento dado System.out.println("Numeros mayores o iguales a 3:"+listaNums.tailSet(3)); System.out.println("Nombres mayores o iguales a Daniel:"+listaNombres.tailSet("Daniel")); //Se muestran los datos en orden descendente System.out.println("Numeros en orden descendente: "+listaNums.descendingSet()); System.out.println("Nombres en orden descendente:"+listaNombres.descendingSet()); } } La clase TreeSet mantiene siempre los elementos de la colección de manera ordenada. Al implementar la interfaz Set, la clase TreeSet tiene la característica de no permitir elementos duplicados. Posee un conjunto de métodos que permiten aprovechar la ventaja de mantener siempre los datos ordenados. 25 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA 3.6 Los generics y las colecciones. Los datos que se almacenan en una colección siempre son de tipo Object, esto significa que teóricamente en una colección podemos almacenar cualquier dato. Esto aunque a primera vista parece una ventaja, en la práctica presenta dificultades, en primer lugar por la falta de seguridad en los datos almacenados y en segundo lugar, por la necesidad de hacer casting o conversiones en los datos almacenados para pasarlos del tipo Object a su tipo real. Veamos el siguiente ejemplo: import java.util.ArrayList; public class Generics1 { public static void main(String arg[]) { //Se crea una colección y se le asignan datos //de diferentes tipos ArrayList miLista= new ArrayList(); miLista.add(4); miLista.add("Juan"); miLista.add(new Alumno("Pedro",4.3)); } } El programa anterior compila sin problemas, porque una colección recibe datos de cualquier tipo, debido a que todos los datos al interior de la colección son tratados como datos de tipo Object. Esta característica no le permite al programador tener un control en tiempo de compilación sobre la integridad de los datos almacenados. Si se intenta recuperar la información de la lista en diferentes variables, se generan errores de compilación, por incompatibilidad de tipo de datos: 26 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA import java.util.ArrayList; public class Generics1 { public static void main(String arg[]) { //Se crea una colección y se le asignan datos //de diferentes tipos ArrayList miLista= new ArrayList(); miLista.add(4); miLista.add("Juan"); miLista.add(new Alumno("Pedro",4.3)); //Para obtener los datos en su original tipo //se requiere hacer casting. int a = miLista.get(0); String b = miLista.get(1); Alumno c = miLista.get(2); } } Las instrucciones anteriores generan error de compilación. Para permitir recuperar los datos en su plenitud, es necesario hacer casting de datos, es decir, realizar una conversión de datos entre el tipo Object (que es por defecto el tipo de dato de cualquier elemento al interior de una colección) y el tipo de dato deseado. 27 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA import java.util.ArrayList; public class Generics1 { public static void main(String arg[]) { //Se crea una colección y se le asignan datos //de diferentes tipos ArrayList miLista= new ArrayList(); miLista.add(4); miLista.add("Juan"); miLista.add(new Alumno("Pedro",4.3)); //Para obtener los datos en su original tipo //se requiere hacer casting. int a = ( Intiger )miLista.get(0); String b = ( String ) miLista.get(1); Alumno c = ( Alumno ) miLista.get(2); } } Para tener mayor control sobre los datos que se almacenan en una colección y para evitar la necesidad de realizar una gran cantidad de casting a la hora de trabajar con colecciones, a partir de la versión 5 de Java se incluye el concepto de Generics. Los generics permiten asignarle a una colección un tipo de dato predeterminado. La sintaxis para la definición de una colección con Generics es la siguiente: 28 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA TipoColección<TipoDato> nombreColeccion = new TipoColección<TipoDato>(); Ejemplo: LinkedList<String>ciudades = new LinkedList<String> (); import java.util.ArrayList; public class Generics2 { public static void main(String arg[]) { //Se crea una colección de tipo entero para //el almacenamiento y procesamiento de numeros ArrayList<Integer> listaNums = new ArrayList<Integer>(); listaNums.add(2); listaNums.add(7); listaNums.add("Juan"); } } En la línea 9 se define una colección y se especifica que solo almacenará datos de tipo entero, usando Generics. En la línea 12 se intenta agregar un dato de otro tipo, con lo cual se genera un error en tiempo de compilación: 29 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA El siguiente ejemplo muestra el uso de colecciones con Generics: import java.util.ArrayList; import java.util.LinkedList; public class Generics3 { public static void main(String arg[]) { //Se crea una colección de tipo entero para //el almacenamiento y procesamiento de numeros ArrayList<Integer> listaNums = new ArrayList<Integer>(); listaNums.add(2); listaNums.add(7); listaNums.add(5); //Se crea una colección de tipo string para //el almacenamiento y procesamiento de cadenas de caracteres LinkedList<String> listaCiudades = new LinkedList<String>(); listaCiudades.add("Manizales"); listaCiudades.add("Medellin"); listaCiudades.add("Cali"); //Se crea una colección de tipo Alumno para //el almacenamiento y procesamiento de Alumnos ArrayList<Alumno> alumnos = new ArrayList<Alumno>(); alumnos.add(new Alumno("Andres",3.2)); alumnos.add(new Alumno("Julian",4.2)); alumnos.add(new Alumno("Carlos",4.9)); //Procesamiento de los datos almacenados en las colecciones //sin necesidad de casting int a=listaNums.get(0); String b=listaCiudades.get(0); Alumno c=alumnos.get(0); System.out.println("El primer numero es "+a); System.out.println("La primera ciudad es "+b); System.out.println("El alumno "+c.getNombre()+" obtuvo una nota de "+c.getNota()); } } El resultado de ejecutar el anterior programa es el siguiente: 30 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje ARREGLOS Y COLECCIONES EN JAVA Control de Documento Construcción Objeto de Aprendizaje Arreglos y Colecciones en JAVA Desarrollador de contenido Experto temático Andrés Julián Valencia Osorio Asesor Pedagógico Rafael Neftalí Lizcano Reyes Productor Multimedia Carlos Julian Ramirez Benitez Programadores Daniel Eduardo Martínez Díaz Líder Expertos Temáticos Ana Yaqueline Chavarro Parra Líder línea de producción Santiago Lozada Garcés 31 FAVA - Formación en Ambientes Virtuales de Aprendizaje SENA - Servicio Nacional de Aprendizaje