PR07 - Estructura for extendido

Anuncio
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
Descargar