Colecciones Nadjet Bouayad-Agha Programación 2007 ArrayList • Un ArrayList es un array dinámico. No tiene restricciones de capacidad. Su tamaño se ajusta de forma dinámica. • Constructor por defecto: new ArrayList(). Inicialmente, la capacidad de un ArrayList creado así es 0. • Los elementos dentro de un ArrayList son Objetos. No pueden ser de tipo básico, pero pueden ser de cualquier tipo de objeto. • La clase ArrayList forma parte del paquete java.util • Para poner un elemento dentro de esta estructura, usamos el método add y para recoger un elemento usamos el método get. • Ejemplos: ArrayListExample.java 2 import java.util.*; public class ArrayListExample1 { public static void main(String[ ] args) { ArrayList thisArrayList = new ArrayList(); thisArrayList.add("hello"); thisArrayList.add(","); thisArrayList.add("are"); thisArrayList.add("you"); thisArrayList.add("?"); } for (int i=0;i<thisArrayList.size();i++) System.out.print(thisArrayList.get(i)+" "); } 3 Métodos de ArrayList http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html • • • int size() -- El tamaño actual (puede ser 0) void add(obj) -- Añade un objeto al final del ArrayList, incrementando su tamaño de 1. obj es un objeto. Object get(N) -- Devuelve el elemento almacenado a la posición N en el ArrayList. N tiene que ser un entero entre 0 y size()-1. – En ArrrayListInteger.java, se convierte el objeto devuelto por get() a un Integer con casting. – En ArrayListString.java, se convierte el objeto devuelto por get() a un String llamando al método toString() de Object. 4 import java.util.ArrayList; public class ArrayListInteger { public static void main(String[] args) { ArrayList numeros = new ArrayList(); Integer num1 = new Integer(10); Integer num2 = new Integer(20); Integer num3 = new Integer(30); Integer num4 = new Integer(40); numeros.add(num1); numeros.add(num2); numeros.add(num3); numeros.add(num4); } } int suma=0; for (int i=0;i<numeros.size();i++) { Integer thisNumero = (Integer)numeros.get(i); suma = suma + thisNumero.intValue(); System.out.print(thisNumero); if (i<numeros.size()-1) System.out.print("+"); else System.out.print("="); } System.out.println(suma); 5 import java.util.*; public class ArrayListString { public static void main(String[] args) { ArrayList cadenas = new ArrayList(); cadenas.add("hello"); cadenas.add(","); cadenas.add("are"); cadenas.add("you"); cadenas.add("?"); } } for (int i=0;i<cadenas.size();i++) { Object object = cadenas.get(i); String cadena = object.toString(); cadena = cadena.toUpperCase(); System.out.print(cadena+" "); } 6 Más Métodos de ArrayList http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html • • • void set(index, obj) – Sustituye el elemento en la posición index por el objeto obj. (index tiene que ser entre 0 y size()-1) dentro del ArrayList, sustituyendo el elemento previamente almacenado a la posición N. Es equivalente a A[N] = obj para un array A. Object remove(index) -- Elimina el elemento a la posición index (index entre 0 y size()-1). Devuelve el objeto eliminado Los elementos después de este objeto están rebajados de una posición. El tamaño del ArrayList disminuye de 1. int indexOf(obj) -- Busca el objeto obj dentro del ArrayList, y si lo encuentra, devuelve la posición donde lo ha encontrado. Si no, devuelve -1. 7 Ejercicios • Escribir los siguientes métodos: – void eliminarTodos(ArrayList cadenas,String cadena) Elimina todas las copias de cadena dentro de cadenas – int min(ArrayList numeros) Devuelve el número más pequeño del array dinámico – void toUpperCase(ArrayList cadenas) Sustituye cada cadena (String) del arrayList por la su versión máyuscula. – int veces(ArrayList cadenas,String cadena) Devuelve el número de veces que aparece la cadena en el array dinámico de cadenas. 8 Iterator • Para recorrer un ArrayList, podemos llamar a get dado un índice (como en los métodos anteriores). • Podemos prescindir de los índices y usar un Iterator sobre este ArrayList: ArrayListIterator.java • La clase Iterator pertenece al paquete java.util • La única función de un objeto de tipo Iterator es recorrer un ArrayList. • Iterator tiene como métodos hasNext (que devuelve un boolean) y next (que devuelve un Object). • Como StringTokenizer, un objeto de tipo Iterator es de un solo uso. 9 import java.util.*; public class ArrayListIterator { public static void main(String[ ] args) { ArrayList thisArrayList = new ArrayList(); thisArrayList.add("hello"); thisArrayList.add(","); thisArrayList.add("are"); thisArrayList.add("you"); thisArrayList.add("?"); } Iterator it = thisArrayList.iterator(); while (it.hasNext()) System.out.print(it.next()+" "); } 10 HashMap • Un HashMap es un array asociativo (o hash table). • Contiene asociaciones <clave,valor>, donde la clave es única y permite acceder al valor. • Ejemplos de asociaciones: – La lista de alumnos, cada alumno es accesible por su NIA. – El directorio telefónico, cada número se accede por los apellidos y la dirección. – Un diccionario, cada definición se accede por lemma. • Ejemplo: UseHashMap.java 11 Métodos de HashMap http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html • • • int size() -- El tamaño actual = número de mappings <clave,valor> boolean isEmpty() - Devuelve true si el map es vacío void put(clave,valor) - Añade el mapping <clave,valor> a map, donde clave y valor son objetos. Si clave ya existe, sustituye su valor por valor. 12 import java.util.*; public class UseHashMap{ public static void main(String[] args) { String aa= "INDIA"; HashMap hashmap = new HashMap(); hashmap.put("one",new Integer(1)); hashmap.put("two",null); hashmap.put("three","THREE"); hashmap.put("four",aa); System.out.println("The size of HashMap = "+ hashmap.size()); System.out.println("If hashmap empty = "+ hashmap.isEmpty()); 13 Métodos de HashMap http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html • • Object get(clave) - Devuelve el valor asociado con clave, o null si clave no existe dentro de map. Set keySet( ) - Devuelve un Set (conjunto de elementos individuales únicos) correspondiente a las claves del map. Podemos iterar sobre este Set (con un Iterator). 14 Nota: Set es una clase de java.util System.out.println("The elements of HashMap are"); Set set= hashmap.keySet(); Iterator iter = set.iterator(); while(iter.hasNext()){ Object clave = iter.next(); Object valor = hashmap.get(clave); System.out.println("Key: " + clave + " Value: " + valor); } • Para recorrer un hashmap: – Conseguimos el conjunto de claves – Recorremos este conjunto, y para cada clave, sacamos su valor correspondiente en el hashmap 15 Métodos de HashMap http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html • • boolean containsKey(clave) - Devuelve true si clave existe dentro de map como clave boolean containsValue(valor) - Devuelve true si valor existe dentro de map como valor 16 System.out.println("Contains key \"one\" ="+hashmap.containsKey("one")); System.out.println("Contains key \"five\" ="+hashmap.containsKey("five")); System.out.println("Contains value of variable aa \"INDIA\" ="+hashmap.containsValue(aa)); Integer thisInteger = new Integer(6); System.out.println("Contains value \“6\” as Integer ="+hashmap.containsValue(thisInteger)); System.out.println("The value for the \"three\" key =" + hashmap.get("three")); 17 Métodos de HashMap http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html • • • Object remove(obj) - Elimina la asociación cuya clave es obj. Devuelve el valor asociado con esta clave antes de eliminar. Collection values( ) - Devuelve una Collection (conjunto de elementos individuales no únicos) de los valores que hay dentro del hashmap. Podemos iterar sobre esta Collection. void clear() - elimina todos los mappings <clave,valor> del array. 18 Nota: Collection es una clase de java.util hashmap.remove("two"); System.out.println("The size of HashMap has reduced by one"); System.out.println("The size of HashMap = " + hashmap.size()); System.out.println("The values of HashMap are =" + hashmap.values()); //Remove all the elements from the HashMap hashmap.clear(); System.out.println("If hashmap empty = " + hashmap.isEmpty()); 19 Ejercicios • Escribir los métodos: – Alumno getAlumno(HashMap alumnos,String nia) Dado un array asociativo de <NIA,objeto-alumno>, el método devuelve el valor (objeto-alumno) dado la clave. – void increment(HashMap palabras,String palabra) Dado un array asociativo palabras de <cadena,numero>, donde cadena es una palabra (tipo) de un corpus y numero el número de veces que ocurre en el corpus, el método incrementa de uno el número de veces que ocurre palabra. Importante: puede que “palabra” no exista en el hashmap, en tal caso habrá que añadirlo. 20