Práctica 7 Tipos List y Set con tipos genéricos Estructura for extendido Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.2 Introducción Como se ha visto en una práctica anterior, la sentencia for es una estructura iterativa. Recordemos que su estructura es for (INI; CON; ACT) { ... } donde INI es la inicialización, CON es la evaluación de la condición y ACT es la actualización. Por ejemplo, para imprimir todos los elementos de una lista de String ls, se podría hacer for (int i = 0; i < ls.size(); i++) { mostrar(ls.get(i)); } Práctica 7: Estructura for extendido Introducción Si un agregado de datos implementa la interfaz Iterable (es un objeto iterable), es posible utilizar una estructura de control específica: el for extendido; también llamada sentencia for-each. Todos los tipos que heredan de Collection son iterables, puesto que Collection<T> implementa Iterable<T>. Por ejemplo, las listas y los conjuntos son iterables. Si llamamos objIter al objeto iterable, compuesto de elementos del tipo T, el for extendido tiene la estructura for (T e: objIter) { … } Dentro del bucle, la variable e (o el nombre que hayamos utilizado) va tomando los valores de todos los elementos de objIter. Práctica 7: Estructura for extendido Introducción La iteración sobre la lista anterior podría hacerse con un for extendido, puesto que List es iterable (implementa Iterable) for (String cadena: ls) { mostrar(cadena); } Por tanto, el for extendido permite iterar sobre los elementos con mucha facilidad. Obsérvese que es la única manera de procesar todos los elementos de un conjunto: a diferencia de las listas, no podemos obtener un elemento concreto de un conjunto. Práctica 7: Estructura for extendido Introducción También se puede usar el for extendido sobre los arrays: si tenemos un array ap de objetos del tipo Punto, con el for normal se podría hacer: for (int i = 0; i < ap.length; i++) { mostrar(ap[i]); } Con el for extendido se puede escribir: for (Punto p: ap) { mostrar(p); } Se puede iterar con el for extendido sobre los arrays, pero cuidado: ¡los arrays no implementan Iterable! Esto significa que no se puede pasar un array a un método que espere recibir un Iterable. Práctica 7: Estructura for extendido Introducción Ejemplo: partiendo de un array de Double ad, presentar en pantalla la suma de sus elementos. Double suma = 0.0; for (Double db: ad) { suma += db; } mostrar(suma mostrar(suma); Práctica 7: Estructura for extendido Introducción El orden en el que se itera sobre los elementos de una estructura que tenga un “orden” en sus elementos (haya un primero, un segundo, etc.) es predecible: del primero al último. Por ejemplo: List<String> ls = new LinkedList<String>(); ls.add("Uno"); ls.add("Dos"); ls.add("Tres"); for (String st : ls) { mostrar(st); } produce la salida Uno Dos Tres Práctica 7: Estructura for extendido Introducción Si una estructura no tiene ningún orden, el for extendido iterará en cualquier orden (no es predecible). Hay que tener esto presente cuando se utilice el tipo Set y el tipo Map (que se verá más adelante). Por ejemplo: Set<String> ss = new HashSet<String>(); ss.add("Uno"); ss.add("Dos"); ss.add("Tres"); for (String st : ss) { mostrar(st); } produce Tres Uno Dos Práctica 7: Estructura for extendido Introducción Si no se desea procesar todos los elementos de un agregado de datos se puede utilizar un if dentro del bucle. Si se desea salir de un for extendido cuando se cumpla determinada condición se puede utilizar la sentencia break. public static Boolean existeImpar(Iterable<Integer> it) { Boolean hayImpar = false; for (Integer n : it) { if (n % 2 == 1) { hayImpar = true; break; } } return hayImpar; } Práctica 7: Estructura for extendido