Esercizio: Lista Circolare

Documenti analoghi
Prova d Esame Compito A

Esempio su strutture dati dinamiche: ArrayList

Prova d Esame Compito A

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Parte I Java. Metodologie di Programmaziona Secondo Appello, 14/2/2006 1

Alberi Binario in Java

Prova d Esame Compito A

Corso sul linguaggio Java

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Polimorfismo parametrico vs polimorfismo per inclusione

Il TDA List è la versione orientata agli oggetti della struttura dati lista. Una sequenza di nodi

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

List. Il TDA List. Interfaccia Position. Il TDA Position. Il TDA List 1. Ancora su Position

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Progettazione del Software

Eccezioni Precisazioni e approfondimenti

STRUTTURE DINAMICHE. (slide: A. Baratè L.A. Ludovico) Programmazione per la Musica Adriano Baratè

Richiami Java e Arrays

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

tipi di dato astratti

Capitolo 7 Un primo sguardo agli oggetti Schema e valori Elementi di classe e d istanza

Prova d Esame Compito A

Corso di Reti di Calcolatori L-A

COGNOME NOME MATRICOLA DATA

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

ALBERI. Angelo Di Iorio Università di Bologna

Corso sul linguaggio Java

ALGORITMI E STRUTTURE DATI

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

Implementazione ADT: Alberi

Programmazione ad Oggetti. Java Parte II

Prova di esame del 19 giugno 2017

La classe java.lang.object

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Corso di Reti di Calcolatori T

LETTURA DI DATI DA INPUT. Gli stream di byte consentono già di leggere dati (numeri di vario tipo), tramite la classe DataInputStream

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012

Conoscere l uso delle collezioni in Java. Conoscere il concetto di Generics (programmazione

Scope e visibilità per classi

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008

E` un tipo astratto di dati che supporta tutti i metodi dell'adt Array list e dell'adt Lista di nodi più i seguenti:

Le gerarchie di tipi: implementazioni multiple e principio di sostituzione

Programmazione a oggetti

Tipi di dati astratti

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Gerarchie e polimorfismo: liste

Programmazione Orientata agli Oggetti in Linguaggio Java

Automazione di test. Si presuppone la conoscenza del documento XML.pdf. Un package per i test automatizzati

Sul pattern Iterator

Diagramma delle classi UML

Sommario. I Uso degli oggetti 39

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Alberi Binari Alberi Binari

Introduzione a Java e all'ambiente di sviluppo

Progettazione del Software

Programmazione. preparazione allo scritto. Informatica / Comunicazione Digitale 19 gennaio 2016

Progettazione del Software

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Le gerarchie di tipi 1

Progettazione del Software

Fondamenti di Informatica T-1

Esonero del corso di Programmazione a Oggetti

Algoritmi e strutture dati

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Oggetti e dati primitivi 1

INFORMATICA III Parte B -Progettazione e Algoritmi

Esercitazione n 2. Obiettivi

unità di compilazione

Programmazione II Compitino (Vers. B)

Programmazione a Oggetti Lezione 11. Eccezioni e Packages

Note ed esercizi aggiuntivi

SOLUZIONE. Requisiti. Requisiti (cont.) Fase di analisi. Università di Roma La Sapienza, Facoltà di Ingegneria

Linguaggi di Programmazione I Lezione 8

Metodi di una Collection

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B.

ArrayList. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Collezioni. (a cura del Prof. Marco Patella)

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Oggi. La programmazione strutturata - III. Sequenza e selezione. Dove siamo. Iterazione: while e do/while. Raffinamenti successivi.

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori A.A. 2009/2010

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.)

Uguaglianza e copia di oggetti

//UML-class-diagram.txt. entrambe Molo e PostoBarca hanno responsabilità su contiene. solo PostoBarca ha responsabilità su assegnato, e

IL LINGUAGGIO JAVA. Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

Le gerarchie di tipi PR

Transcript:

Esercizio: Lista Circolare Si realizzi in Java un gestore di una lista circolare. La dimensione minima della lista è 2 elementi (ed è anche la dimensione iniziale). La dimensione massima è 20 elementi. Il gestore della lista deve consentire di cercare, aggiungere e rimuovere elementi. Ogni elemento della lista contiene le informazioni su un frame, ossia l elemento base di un flusso di dati multimediali. Il frame può essere audio o video.

Esercizio: Lista Circolare Ogni frame audio è caratterizzato da: nome dello stream numero di sequenza (un intero positivo) bitrate (un intero positivo multiplo di 16) codifica (una String tipo MPEG Layer 3, Dolby AAC, ecc.) flag mono/stereo Ogni frame video è caratterizzato da: nome dello stream numero di sequenza (un intero positivo) bitrate (un intero multiplo di 24) standard (una String tipo PAL, HDTV, ecc.) codifica (una String tipo MPEG4, H.264, ecc.)

Esercizio: Lista Circolare Inserimento degli elementi: Ogni frame audio può essere inserito nella lista solo se appartiene allo stesso stream ed ha la medesima codifica di quelli già presenti. Analogamente, un frame video può essere inserito solo se ha medesimo nome dello stream, della codifica e dello standard rispetto agli altri elementi della lista. Inoltre, ad ogni frame inserito deve essere associato un numero di sequenza ottenuto incrementando di una unità il numero di sequenza dell ultimo frame dello stesso tipo inserito.

Esercizio: Lista Circolare La funzione di inserimento di un frame nella lista circolare deve inoltre garantire che partendo da un certo elemento, sia possibile percorrere l intera struttura osservando un andamento crescente dei numeri di sequenza dei frame dello stesso tipo. 8 12 6 partendo da qui, i frame hanno numero di sequenza crescente 6 7 n Frame Audio 5 11 3 n Frame Video

Esercizio: Lista Circolare Ricerca degli elementi: La funzione di ricerca deve permettere la ricerca di un frame sulla base di almeno un parametro distintivo dell oggetto. Ad esempio, il numero di sequenza.

Analisi delle specifiche Lista: elenco dinamico di elementi. L attributo dinamico indica che la lista non ha numero fisso di elementi. Nel nostro esempio, sulla lista sono specificati vincoli e proprietà: il numero minimo (2) e massimo (20) di elementi le operazioni che è possibile svolgere sulla lista

Analisi delle specifiche La lista deve contenere degli elementi. Gli elementi della lista sono entità che contengono informazioni su altre entità dette Frame. In particolare, sono considerati due tipi specifici di Frame: i Frame Audio i Frame Video

Implementazione Dobbiamo implementare tre entità: 1. La lista 2. I nodi della lista 3. I frame, ossia le entità contenute nei nodi.

Il Frame Le entità di cui dobbiamo tenere traccia nella lista sono i frame. Sono definiti due tipi di frame, i quali condividono caratteristiche comuni. Frame Frame Audio Frame Video Li modelliamo perciò in Java come sottoclassi di una classe comune.

La classe Frame public abstract class Frame { protected String nomestream, codifica; protected int sequencenum, bitrate; public int getbitrate() { return bitrate; public String getcodifica() { return codifica; public String getnomestream() { return nomestream; public int getsequencenum() { return sequencenum; public void setsequencenum(int sequencenum) { this.sequencenum = sequencenum;

La sottoclasse AudioFrame public class AudioFrame extends Frame { private boolean isstereo; public AudioFrame(String nomestream, String codifica, int bitrate, boolean stereo) throws FrameException { if ((bitrate % 16!= 0) (bitrate <= 0)) throw new FrameException("wrong audio bitrate"); this.nomestream = nomestream; this.codifica = codifica; this.bitrate = bitrate; isstereo = stereo; public boolean isstereo() { return isstereo;

Il Nodo Il nodo è l elemento che costituisce la lista. Ciascun nodo contiene: L oggetto Frame che deve descrivere Il riferimento al nodo successivo node frame node frame next node next node

La classe Nodo public class Nodo { private Frame framedata; private Nodo nextnodo; public Nodo(Frame frame) { framedata = frame; public Nodo getnextnodo() { return nextnodo; public void setnextnodo(nodo nextnodo) { this.nextnodo = nextnodo; public Frame getframedata() { return framedata;

La classe Lista public class ListaCircolare { private Nodo lastelement; private int nsequencevideoframe, nsequenceaudioframe; private String codificaaudio, codificavideo, stream; public ListaCircolare(Frame firstelement, Frame secondelement) throws ListException { [corpo del costruttore vedi slide successive]

La Lista costruttore (1) public ListaCircolare(Frame firstelement, Frame secondelement) throws ListException { if (! firstelement.getnomestream().equalsignorecase( secondelement.getnomestream() ))) throw new ListException("Frame di stream diversi"); lastelement = new Nodo(secondElement); Nodo temp = new Nodo(firstElement); lastelement.setnextnodo(temp); temp.setnextnodo(lastelement);

La Lista costruttore (1) Nodo lastelement Nodo temp Frame secondelement nextnodo Fame firstelement nextnodo

La Lista costruttore (2) if (firstelement instanceof VideoFrame) { if (secondelement instanceof VideoFrame) { if (!firstelement.getcodifica().equalsignorecase(secondelement.getcodifica() )) throw new ListException("Codifiche video incompatibili"); firstelement.setsequencenum(1); secondelement.setsequencenum(2); nsequencevideoframe = 2; nsequenceaudioframe = 0; else { firstelement.setsequencenum(1); secondelement.setsequencenum(1); nsequencevideoframe = 1; nsequenceaudioframe = 1; codificavideo = firstelement.getcodifica(); codificaaudio = secondelement.getcodifica();

La Lista costruttore (3) else { if (secondelement instanceof VideoFrame) { firstelement.setsequencenum(1); secondelement.setsequencenum(1); nsequencevideoframe = 1; nsequenceaudioframe = 1; codificavideo = secondelement.getcodifica(); codificaaudio = firstelement.getcodifica(); else { if (!firstelement.getcodifica().equalsignorecase(secondelement.getcodifica() )) throw new ListException("Codifiche audio incompatibili"); firstelement.setsequencenum(1); secondelement.setsequencenum(2); nsequencevideoframe = 0; nsequenceaudioframe = 2;

La Lista inserimento Frame public void insertframe(frame f) throws ListException { if (f instanceof VideoFrame) { if (! f.getcodifica().equalsignorecase(codificavideo)) throw new ListException("Codifica video non compatibile"); f.setsequencenum(++nsequencevideoframe); else { if (! f.getcodifica().equalsignorecase(codificaaudio)) throw new ListException("Codifica audio non compatibile"); f.setsequencenum(++nsequenceaudioframe); Nodo nuovonodo = new Nodo(f); nuovonodo.setnextnodo(lastelement.getnextnodo()); lastelement.setnextnodo(nuovonodo); lastelement = nuovonodo;

La Lista inserimento Frame Nodo lastelement Frame secondelement nextnodo Frame firstelement nextnodo Nodo nuovonodo Nodo lastelement Frame f nextnodo

La Lista metodo di ricerca public VideoFrame searchvideoframe(int sequencenum) { if (sequencenum > nsequencevideoframe) return null; else { VideoFrame result = null; Nodo temp = lastelement; boolean prosegui = true; while (prosegui) { try { result = (VideoFrame)temp.getNextNodo().getFrameData(); if (result.getsequencenum() == sequencenum) prosegui = false; catch (ClassCastException e) { temp = temp.getnextnodo(); if (temp == lastelement.getnextnodo()) prosegui = false; return result;

ArrayList La classe ArrayList implementa un array dinamico, a cui è possibile aggiungere elementi senza che sia stabilita una dimensione massima in pratica, esibisce il comportamento di una lista. Rispetto a Vector (classe del package java.util), i metodi non sono synchronized e pertanto sono più veloci non dovendo garantire la mutua esclusione nell accesso ai dati gestiti dall istanza di Vector ArrayList gestisce internamente un array di Object: possono essere quindi inseriti oggetti di qualunque tipo

ArrayList - svantaggi Internamente, ArrayList si poggia su un array classico : nel caso siano inseriti elementi in eccesso, viene generato un nuovo array di dimensioni maggiori in cui sono copiati i valori dell array iniziale per poi aggiungere i nuovi dati. Tale processo può diventare pesante per liste che variano frequentemente ed in maniera significativa Il metodo get(int index) restituisce l elemento in posizione index: essendo però la lista formata da elementi di classe Object, l elemento ritornato è di classe Object e può essere ricondotto alla classe reale (se diversa da Object) attraverso un cast esplicito. Ciò però richiede la conoscenza della classe dell elemento estratto!

ArrayList accesso agli elementi ArrayList list = new ArrayList(); Integer numero = new Integer(10); String nome = new String( Diego"); list.add(numero); list.add(nome); Integer recuperanumero = (Integer)list.get(0); String recuperanome = (String)list.get(1); if (list.get(0) instanceof Integer) System.out.println( Numero!"); else System.out.println( Nooooo"); if (list.get(1) instanceof String) System.out.println( Nome! ); else System.out.println( Nooooo );