Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

Astrazioni Polimorfe e Tipi Generici. 2 Polimorfismo Dal Greco molte forme Una variabile polimorfa può riferirsi a oggetti di classi diverse Un metodo.
Tipi di dato astratti Lista, Pila, Coda, Albero.
Strutture dati lineari
Iterazione Capitolo 17 febbraio 2004 Iterazione.
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
MATLAB.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Realizzazione del file system
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
Tail recursion: esempio
Mergesort1 if (n>1) /* la collezione contiene almeno due elementi. */ {1. Dividi la collezione in due di circa la metà degli elementi. 2. chiamata ricorsiva.
Esercizi su alberi binari di ricerca
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 11 (19 novembre 2008) Programmazione in Java: controllo del flusso (iterazione)
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Scomposizione di stringhe
tipo astratto, implementazione, algoritmi
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Selezione (=scelta) con “if-else”
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Java Collections.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
Corso di informatica Athena – Periti Informatici
Corso di informatica Athena – Periti Informatici
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Corso JAVA Lezione n° 03 Istituto Statale di Istruzione Superiore “F. Enriques”
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Astrazioni sul controllo Iteratori

2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di unoperazione che consenta cicli (iterazioni) –Es.: gli elementi possono essere stampati, oppure sommati tra loro, oppure confrontati per cercare il più piccolo o il più grande, ecc. –Es. IntSet: lutilizzatore ha bisogno di verificare se tutti gli elementi sono positivi Se la collezione è un Vector, un array o un ArrayList, è facile –Es. stampare tutti gli elementi del vettore vect, dal primo all'ultimo: for (int i = 0; i < vect.size(); i++) System.out.println(vect.get(i)); –array e vettori: organizzazione lineare degli elementi, e possiamo accedere ad un qualunque elemento usando un indice Con altri contenitori/collezioni? Con IntSet? non cè get o size –Information hiding non consente (giustamente!) laccesso diretto al rep di un contenitore! Non possiamo scrivere, se set è un IntSet: for (int i = 0; i < set.els.size(); i++) System.out.println(set.els.get(i)); –Possibilità: fare choose su una copia di set, fare verifica e poi remove... molto inefficiente

3 Iterare su collezioni Soluzione poco generale: scrivere metodi in IntSet per stampare e per verificare se elementi positivi –come fare a prevedere in anticipo tutti gli usi di IntSet? Es. calcolare la somma di tutti gli elementi Soluzione inefficiente : IntSet ha un metodo che restituisce un array con tutti gli elementi –si consuma spazio e tempo di memoria (es. ricerca che si interrompe al primo elemento...). A volte però è utile. Soluzione inefficiente: fornire anche IntSet di size e di get for (int i = 0; i < set.size( ); i++) System.out.println(set.get(i)); –con IntSet funzionerebbe bene finché si usa Vector. Ma se poi si cambiasse implementazione? se fosse con lista... Su molte strutture dati accesso casuale a i- esimo elemento può essere molto inefficiente! Es. con linked list, occorre sempre scorrere gli elementi precedenti a quello in posizione i: numero accessi alla lista tramite la get(i): n = n(n+1)/2, con n = set.size().

4 Iteratori Soluzione generale: introdurre oggetti detti iteratori in grado di spostarsi sugli elementi dei contenitori –Associare a ogni contenitore un iteratore –Iteratore rappresenta un'astrazione del concetto di puntatore a un elemento del contenitore e permette di scorrere il contenitore senza bisogno di conoscere l'effettivo tipo degli elementi. –Es. IntSet: oggetto iteratore su IntSet con metodi: next() per restituire lelemento su cui si è posizionati e muoversi su quello successivo; hasNext() per verificare se siamo sullultimo elemento. public static boolean insiemePositivo(IntSet set){ genera Iteratore itr per set (posizionato al primo elemento); while (itr.hasNext( )) if (itr.next()) <0) return false; return true;}

5 Da Eckel, Thinking in Java: Theres not much you can do with the Java Iterator except: Ask a container to hand you an Iterator using a method called iterator( ). This Iterator will be ready to return the first element in the sequence on your first call to its next( ) method. Get the next object in the sequence with next( ). See if there are any more objects in the sequence with hasNext( ). Remove the last element returned by the iterator with remove()

6 Iteratori in Java Una collezione deve definire (almeno) un metodo che ritorna un oggetto di tipo Iterator Nome standard: iterator() ma sarebbero possibili anche altri nomi (ad esempio, elements()) ensures (* ritorna un oggetto che consente di iterare su IntSet *); public Iterator elements() boolean hasNext(); Integer next();

7 Interface Iterator In Java, una interfaccia è una dichiarazione di quali metodi pubblici deve possedere una classe che implementa linterfaccia Per standardizzare luso degli iteratori, in Java cè interfaccia Iterator in java.util (dove si trova anche la run-time exception NoSuchElementException) public interface Iterator { (* \result è true se e solo se esiste un prossimo elemento *); public boolean hasNext ( ); (* fornisce il prox elemento se esiste *); signals (NoSuchElementException e) // (*non esiste un prossimo elem. *); public E next() throws NoSuchElementException; (* rimuove ultimo elemento ritornato da next() *); public void remove ( ); //OPZIONALE, nel senso che si può implementare senza rimozione } NB: Per compatibilità con versioni precedenti di Java esiste versione raw del tipo Iterator che non ha parametro e si riferisce implicitamente a elementi di tipo Object –simile a quanto avviene con i contenitori ArrayList e Vector –ciò accade in realtà per tutti i tipi generici del linguaggio

8 Uso iteratore per IntSet public static boolean stampa(IntSet set){ for (Iterator itr = set.elements(); itr.hasNext( );) System.out.println(itr.next())); } public static boolean insiemePositivo(IntSet set){ for (Iterator itr = set.elements(); itr.hasNext( );) if (itr.next()) <0) return false; return true;} In alternativa, funzione può essere definita in base solo a iteratore!

9 Iterare su collezioni qualunque Vantaggio: molti algoritmi (es. ordinamento, ricerca,...) possono essere descritti solo in base a iteratori e alcuni metodi standard, indipendentemente dal tipo degli elementi! È potente astrazione sul controllo: the true power of the Iterator: the ability to separate the operation of traversing a sequence from the underlying structure of that sequence. Esempi: stampa; ricerca sequenziale, con confronto con equals () class Iterazioni { public static void printAll(Iterator itr) { while(itr.hasNext()) System.out.println(itr.next()); //NB:conv. automatica a String } ensures (* \result == o è presente nella collezione associata alliteratore itr *); public static boolean cerca(Iterator itr, o){ while (itr.hasNext( )) if (o.equals(itr.next())) return true; return false;}}

10 Generatori e iteratori; remove Nomenclatura standard: –iteratore è oggetto che consente di muoversi su collezioni –Interfaccia Iterator è in java.util e fornisce anche remove() (opzionale) Nomenclatura Liskov: –generatore è oggetto che consente di muoversi su collezioni –iteratore è un metodo che restituisce un generatore –Interfaccia Iterator non ha remove()

11 Specifica: metodi iteratori per Poly e IntSet public class Poly { //come visto prima, e in più: public Iterator terms ( ) (* \result è un che dà gli dei termini non di this *); } public class IntSet { //come visto prima, e in più: public Iterator elements( ) (* \result è un che i valori contenuti in this, 1 sola volta (* this non deve modificato quando è in uso *);

12 Implementazione con classe interna public class Poly { private int [ ] trms; private int deg; public Iterator terms() { return new PolyGen(this); } //classe interna private static class PolyGen implements Iterator {... } … //tutte le altre operazioni della classe } non posso generare esemplari fuori dalla classe Poly, ma PolyGen può accedere ai private di un Poly static: PolyGen associata alla classe Poly. (altrimenti ogni oggetto PolyGen associato a un oggetto Poly) Non necessario Implementa interfaccia Iterator: ha next(), hasNext()

13 La classe interna per literatore private static class PolyGen implements Iterator { private Poly p; //il Poly da iterare private int n; //prox el. da considerare PolyGen(Poly lui) { lui!=null; p=lui; if(p.trms [0]==0)n=1; else n=0; //n=1 serve per hasNext() se p.deg ==0 } public boolean hasNext ( ) {return n<=p.deg;} public int next ( ) throws NoSuchElementException { for (int e=n; e<=p.deg; e++) if (p.trms[e] != 0) {n=e+1; return new e;} throw new NoSuchElementException("Poly.terms"); } Implementa interfaccia Iterator: ha next(), hasNext()

14 Iteratori "stand alone" Un iteratore potrebbe NON far parte di una classe, ma essere una procedura statica "stand alone" Per esempio, iteratore allFibos che genera tutti i numeri di Fibonacci –o generatore di numeri primi del testo Per questo motivo, serve definire la classe interna come static: un metodo static di una classe non può accedere a un costruttore di una classe interna non static

15 public class Num { public static Iterator allFibos( ) { return new FibosGen( ); } //classe interna private static class FibosGen implements Iterator { private int prev1, prev2; //i due ultimi generati private int nextFib; //nuovo # Fibonacci generato FibosGen( ) {prev2=1; prev1=0;} public boolean hasNext ( ) {return true;} public Object next ( ) { nextFib=prev1+prev2; prev2=prev1; prev1=nextFib; return Integer(nextFib); } static necessario: costruttore chiamato da un metodo statico! NB: versione raw del tipo Iterator

16 Uso delliteratore per i # Fibonacci System.out; (*stampa tutti # Fibonacci <=m in ordine crescente *); public static void printFibos(int m); { Iterator g = Num.AllFibos(); while (g.hasNext()) {//sempre true… int p = ((Integer) g.next()).IntValue(); if (p > m ) return; System.out.println(prox Fibonacci e` + p); }

17 RI e AF per iteratori Simili a quelli di un ADT ordinario Caso di PolyGen –RI(c) c.p null && (0<=c.n<=c.p.deg+1) –Oppure in JML: private invariant c.p != null && 0 <= c.n && c.n <= c.p.deg+1; espresso in termini delle instance variable di Poly –AF: la sequenza degli elementi ancora da generare – AF(c)=[x1, …xk], sequenza che contiene tutti e soli gli elementi 0 che in c.p.trms occupano posizione j >=c.n, nello stesso ordine

18 Osservazioni An iterator is an object whose job is to move through a sequence of objects and select each object in that sequence without the client programmer knowing or caring about the underlying structure of that sequence. In addition, an iterator is usually whats called a light-weight object: one thats cheap to create Collezione può avere più tipi di iteratori (e quindi più metodi per generarli) Esempio: una collezione potrebbe avere: (* \result è generatore dallelemento più piccolo al più grande *); public Iterator smallToBig() {} ensures (* \result generatore dallelemento più grande *); public Iterator bigToSmall() {} (* \result è generatore dal primo elemento nellordine di inserimento *); public Iterator first() { …

19 Collezioni mutabili e metodo remove remove è unoperazione opzionale: se non è implementata, quando invocata viene lanciata UnsupportedOperationException In effetti, raramente è utile modificare una collezione durante uniterazione: più spesso si modifica alla fine (e.g., trovo elemento e lo elimino, poi iteratore non più usato) Semantica di remove() assicurata dal contratto dellinterfaccia: –elimina dalla collezione lultimo elemento restituito da next(), a patto che venga chiamata una sola volta per ogni chiamata di next() collezione non venga modificata in qualsiasi altro modo (diverso dalla remove) durante literazione –altrimenti lanciata eccezione IllegalStateException se metodo next() mai chiamato o se remove() già invocata dopo ultima chiamata di next() semantica della remove() non specificata se collezione modificata in altro modo (diverso dalla remove) durante literazione –vincolo ragionevole: è prevedibile che una modifica durante uniterazione lasci la collezione in uno stato inconsistente

20 Interfaccia Iterable (1) Per standardizzare luso degli iteratori, in Java esiste anche linterfaccia Iterable (in java.lang) public interface Iterable { ensures (* restituisce un iteratore su una collezione di // elementi di tipo T *); public Iterator iterator (); } Le classi che implementano linterfaccia Iterable sono tipicamente collezioni che forniscono un metodo di nome standard iterator() per ottenere un oggetto iteratore, con cui scandirne gli elementi

21 Interfaccia Iterable (2) Un contenitore che implementa linterfaccia Iterable può essere argomento di unistruzione for-each –il codice for ( Tipo variabile : oggettoContenitore ) corpoDelCiclo –viene tradotto dal compilatore nel seguente Iterator iter = oggettoContenitore.iterator(); while ( iter.hasNext() ) { Tipo variabile = iter.next(); corpoDelCiclo; } E necessario implementare Iterable se si vuole costruire una collezione da usare con for-each –è unutile semplificazione per gli utenti della collezione: per iterare su di essa, se non devono fare remove e non vogliono seguire un ordine particolare, non devono generare esplicitamente un iteratore, perchè usando un ciclo for-each lo fanno fare al compilatore –il prezzo della semplificazione lo paga limplementatore, che deve codificare il metodo iterator()