Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porAsunción Silva Araya Modificado hace 9 años
1
Iterables virtuales Concepto, Metodología de desarrollo y Ejemplos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.0 Unidad Didáctica 14
2
UD14: Iterables virtuales Índice Concepto Metodología de implementación Ejemplos Secuencia Aritmética Secuencia Primos Secuencia Geométrica Secuencia Aleatoria Secuencia Fibonacci Secuencia Captcha
3
UD14: Iterables virtuales Concepto El programador necesita una secuencia finita de elementos como parte de un procedimiento No es necesario un agregado para almacenarlos Cada elemento se obtiene según un cálculo (método) for( T elem : Iterable ){ UTILIZAR(elem); } X
4
UD14: Iterables virtuales Metodología de implementación Seguir la metodología vista en la unidad anterior usando una clase interna Iterator. En el constructor de la clase interna se hace un cálculo previo del que sería primer elemento a devolver. En el método next de la clase interna se recupera el elemento previamente calculado (aux vActual), se calcula el que será el siguiente elemento a devolver y se devuelve (return) el anterior recuperado previamente (aux)
5
UD14: Iterables virtuales Metodología de implementación Los atributos de la clase Iterable (externa) son visibles desde la clase Iterator (interna) Si la clase interna Iterator necesita solamente un atributo no es necesario definir su constructor. Si se puede obviar el constructor de la clase interna, el que sería primer elemento a devolver deberá inicializar el atributo que lo recoge, llamado normalmente vActual.
6
UD14: Iterables virtuales Ejemplos: Secuencia Aritmética Será una clase que permita obtener números reales según un incremento dado El objetivo es poder operar del siguiente modo: mostrar(“Una secuencia aritmética”); Iterable sa = new SecuenciaAritmetica(1,21,4); for(Double n : sa) { mostrarConRepeticiones(‘z’, (int) n); // muestra una línea en pantalla con el primer parámetro // repetido tantas veces como indica el segundo (n veces) } Una secuencia aritmética z zzzzz zzzzzzzzz zzzzzzzzzzzzz zzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzz
7
UD14: Iterables virtuales Ejemplos: Secuencia Aritmética import java.util.Iterator; import java.util.NoSuchElementException; public class SecuenciaAritmetica implements Iterable { private Double vInicial, cota, salto; public SecuenciaAritmetica(Double primero, Double limite, Double incremento){ if(incremento 0 && primero>limite)) { throw new IllegalArgumentException("Parámetros no válidos"); } vInicial = primero; cota = limite; salto = incremento; } public Iterator iterator(){ return new IteradorSecuenciaAritmetica( ); } … Continúa…
8
UD14: Iterables virtuales Ejemplos: Secuencia Aritmética // Comienza la clase interna Iterator private class IteradorSecuenciaAritmetica implements Iterator { private Double vActual = vInicial; public Double next() { if (!hasNext()) throw new NoSuchElementException( ); Double aux = vActual; vActual = vActual + salto; return aux; } public boolean hasNext() { return vActual<=cota; } public void remove() { throw new UnsupportedOperationException( ); } } /* Fin de la clase interna Iterator*/ } // Fin de la clase externa Iterable
9
UD14: Iterables virtuales Ejemplos: Secuencia Primos Será una clase que permita obtener todos los números primos entre 1 y n (ambos inclusive) El objetivo es poder operar del siguiente modo: mostrar(“¿Una secuencia de primos?”); Integer[ ] valores = {10,9,8,7,6,5,4,3,2,1,0}; Iterable sp = new SecuenciaPrimos(10); for(Long x : sp) mostrar(valores[ (int) x]); ¿Una secuencia de primos? 9 8 7 5 3
10
UD14: Iterables virtuales Ejemplos: Secuencia Primos import java.util.Iterator; import java.util.NoSuchElementException; public class SecuenciaPrimos implements Iterable { private long cota; public SecuenciaPrimos(long limite){ if(limite<=0) throw new IllegalArgumentException("El valor final debe ser mayor que 0"); cota = limite; } public Iterator iterator( ) { return new IteradorSecuenciaPrimos( ); } private class IteradorSecuenciaPrimos implements Iterator { private Long vActual = 1; … Continúa…
11
UD14: Iterables virtuales Ejemplos: Secuencia Primos public boolean hasNext() { return vActual <= cota; } public Long next(){ if (!hasNext()){ throw new NoSuchElementException(); } long aux = vActual; vActual++; while(!Enteros.esPrimo(vActual)) vActual++; return aux; } public void remove( ) { throw new UnsupportedOperationException( ); } } /*Fin de la clase interna (Iterator)*/ } // Fin de la clase externa (Iterable)
12
UD14: Iterables virtuales Ejemplos: Secuencia Geométrica Será una clase que permita obtener números reales según una razón dada El objetivo es poder operar del siguiente modo: mostrar(“Una secuencia geométrica”); Iterable sa = new SecuenciaGeometrica(1,100,5); for(Double n : sa) mostrarConRepeticiones(‘v’, (int) n); Una secuencia geométrica v vvvvv vvvvvvvvvvvvvvvvvvvvvvvvv
13
UD14: Iterables virtuales Ejemplos: Secuencia Geométrica … // imports public class SecuenciaGeometrica implements Iterable { private Double vInicial, vFinal, razon; public SecuenciaGeometrica(Double vInicial, Double vFinal, Double razon){ if(razon<=1) throw new IllegalArgumentException("La razón debe ser mayor que 1"); if(vInicial>0 && vFinal 0) throw new IllegalArgumentException("Los valores inicial y final deben tener el mismo signo"); if(vInicial==0 || vFinal==0) throw new IllegalArgumentException("Los valores inicial y final deben ser distintos de 0"); if(vInicial<0 && vInicial<vFinal) throw new IllegalArgumentException("El valor inicial debe ser mayor que el valor final para números negativos"); if(vInicial>0 && vInicial>vFinal) throw new IllegalArgumentException("El valor inicial debe ser menor que el valor final para números positivos"); ths.vInicial=vInicial; this.vFinal=vFinal; this.razon=razon; } public Iterator iterator( ) { return new IteradorSecuenciaGeometrica( ); } … Continúa…
14
UD14: Iterables virtuales Ejemplos: Secuencia Geométrica private class IteradorSecuenciaGeometrica implements Iterator { vActual = vInicial; public Double next() { if (!hasNext()) throw new NoSuchElementException(); Double aux = vActual; vActual = vActual * razon; return aux; } public boolean hasNext( ) { return vFinal>=vInicial ? vActual =vFinal; } public void remove( ) { throw new UnsupportedOperationException( ); } } /*Fin de la clase interna (Iterator)*/ } // Fin de la clase externa (Iterable)
15
UD14: Iterables virtuales Ejemplos: Secuencia Aleatoria Será una clase que permita obtener un conjunto finito de números enteros El objetivo es poder operar del siguiente modo: mostrar(“Una secuencia aleatoria“); Iterable sa = new SecuenciaAleatoria(1,9,6); for(Integer n : sa) mostrarConRepeticiones(n, n); Una secuencia aleatoria 4444 999999999 666666 22 7777777 22
16
UD14: Iterables virtuales Ejemplos: Secuencia Aleatoria import java.util.Iterator; import java.util.NoSuchElementException; public class SecuenciaAleatoriaNaturales implements Iterable { private Integer menor, mayor, cantidad; public SecuenciaAleatoriaNaturales(Integer cantidad) { if(cantidad =mayor || menor<0) { throw new IllegalArgumentException("Parámetros no válidos"); this.menor = menor; this.mayor = mayor; this.cantidad = cantidad; } public Iterator iterator() { return new IteradorSecuenciaAleatoriaNaturales ( ); } private class IteradorSecuenciaAleatoriaNaturales implements Iterator { private Integer rango, contador; … Continúa…
17
UD14: Iterables virtuales Ejemplos: Secuencia Aleatoria public IteradorSecuenciaAleatoriaNaturales( ) { rango = mayor-menor; vActual = menor+Math.random()*rango; contador = 1; } public Integer next() { if (!hasNext()) throw new NoSuchElementException(); Integer aux=vActual; vActual = menor+Math.random()*rango; contador++; return aux; } public boolean hasNext() { return contador<=cantidad; } public void remove() { throw new UnsupportedOperationException( ); } } /*Fin de la clase Iterator (interna)*/ } // Fin de la clase Iterable (externa)
18
UD14: Iterables virtuales Será una clase iterable que permita obtener un subconjunto finito de los n primeros números de Fibonacci El objetivo es poder operar del siguiente modo: mostrar(“¿Una secuencia Fibonacci?”); Integer[ ] valores = {10,11,12,13,14,15}; Iterable sp = new SecuenciaFibonacci(5); for(Long x : sp) mostrar(valores[ (int) x]); Ejemplos: Secuencia Fibonacci ¿Una secuencia Fibonacci? 10 11 12 13 15
19
UD14: Iterables virtuales Ejemplos: Secuencia Fibonacci public class SecuenciaFibonacci implements Iterable { private Long cota; public SecuenciaFibonacci(Long limite){ if(limite<0) throw new IllegalArgumentException("El valor final debe ser mayor que 0"); cota = limite; } public Iterator iterator( ) { return new IteradorSecuenciaFibonacci( ); } … Continúa…
20
UD14: Iterables virtuales Ejemplos: Secuencia Fibonacci private class IteradorSecuenciaFibonacci implements Iterator { private long vActual, vSiguiente,; public IteradorSecuenciaFibonacci( ) { vActual = 0; vSiguiente = 1; } public Long next(){ if (!hasNext()) throw new NoSuchElementException(); Long aux = vActual; vActual = vSiguiente; vSiguiente = aux + vActual; return aux; } public boolean hasNext() { return vActual <= cota; } public void remove() { throw new UnsupportedOperationException( ); } } /*Fin de la clase Iterator*/ } // Fin de la clase Iterable
21
UD14: Iterables virtuales Ejemplos: Secuencia Captcha Será una clase que permita obtener un conjunto finito de cadenas de tamaño dado El objetivo es poder operar del siguiente modo: mostrar(“Una secuencia Captcha“); Iterable sc = new SecuenciaCaptcha(4,6); for(String s: sc) mostrar(s); Una secuencia Captcha ghav lmpj uytd qwri kxzu iebf
22
UD14: Iterables virtuales Ejemplos: Secuencia Captcha import java.util.Iterator; import java.util.NoSuchElementException; public class SecuenciaCaptcha implements Iterable { private Integer numChars, numCaptchas; public SecuenciaCaptcha(Integer longitud, Integer items) { if(longitud 10 || items 100) throw new IllegalArgumentException("Parámetros no válidos"); numChars = longitud; numCapchas = items; } public Iterator iterator( ) { return new IteradorSecuenciaCaptcha( ); } private class IteradorSecuenciaCaptcha implements Iterator { private Integer contador; private String vAct; Continúa…
23
UD14: Iterables virtuales Ejemplos: Secuencia Captcha public IteradorSecuenciaCaptcha( ) { contador = 0; vActual = crearCaptcha( ); } public String next() { if (!hasNext()) throw new NoSuchElementException(); String aux=vActual; vActual = crearCaptcha( ); return aux; } public boolean hasNext( ) { return contador<=numCaptchas; } public void remove( ) { throw new UnsupportedOperationException( ); } private String crearCaptcha( ) { … } } /*FIN de la clase Iterator*/ } // FIN de la clase Iterable private String crearCaptcha( ) { String res = "" ; for (int i = 0; i<numChars; i++) { char c = (char) (Math.random()*26 + ‘a’); res+=c; } contador++; return res; }
24
UD14: Iterables virtuales Clase de utilidad: Factoría Iterables2 public class Iterables2 {... public static Iterable from(String nombreFichero) {…}... } public static void main(String[ ] args) { Iterable lineas = Iterables2.from(“Informaticos.txt“); for(String s: lineas) mostrar(s); } A. Turing C. Shannon D. Engelbart B.W. Kernighan D. M. Ritchie J. Gosling
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.