LABORATORIO DI PROGRAMMAZIONE DI STRUTTURE DATI
ESERCIZI SU LISTE
24 Aprile 2002

 


Per questa esercitazione è necessario utilizzare il package lab2.
 

Risolvere i problemi elencati sotto NELL'ORDINE IN CUI SONO ELENCATI. Non si richiede di scrivere TUTTI  i programmi, ma quelli risolti devono compilare correttamente e produrre i risultati richiesti.

Alla fine dell'esercitazione, copiare tutti i file prodotti in una cartella identificata dai cognomi dei componenti del gruppo, sotto serverPu/Esercizi/Lez24004

Siete invitati a completare (alcuni de)gli esercizi fuori dall'orario di esercitazione, soprattutto se avete trovato serie difficoltà a svolgerli. Potete mandare l'eventuale completamento all'indirizzo guerrini@disi.unige.it
 


Esercizio 1


Si scriva la classe MultipliList contentente il metodo statico multipli:
 

import lab2.*;

public class MultipliList {
    public static List multipli ( List lst, int n ) {
     // da completare
   }
}

Si assume che tutti gli elementi della lista lst siano di tipo Integer: se cio' non e' vero, il metodo deve lanciare un'eccezione ClassCastException. Il metodo multipli restituisce una lista contenente tutti gli oggetti di lst che sono multipli di n. Il metodo non deve modificare la lista lst. Il metodo deve lanciare un'eccezione IllegalArgumentException se l'intero passato per parametro e' 0.
Per testare la classe MultipliList, si compili ed esegua la classe TestMultipliList. L'output deve essere ESATTAMENTE il seguente:
 

Provo il metodo MultipliList.multipli(List,int)...
Multipli di 5 in [  7  11  45  -5  0  9  10  6  1  2]: [  45  -5  0  10]
Lista dopo multipli: [  7  11  45  -5  0  9  10  6  1  2]
Multipli di 10 in [  11  -5  9  11  6]: []
Lista dopo multipli: [  11  -5  9  11  6]
Multipli di 3 in []: []
Lista dopo multipli: []
invoco multipli(2,[  3  56  89  bingo!])
Ok: multipli ha lanciato l'eccezione java.lang.ClassCastException
E se invoco  multipli(0,...) ?
Bene: mi aspettavo proprio una java.lang.IllegalArgumentException

Esercizio 2


Si scriva la classe TogliMultipli contentente il metodo statico togliMultipli:
 

import lab2.*;

public class TogliMultipli {
    public static int togliMultipli ( int n, List lst ) {
     // da completare
   }
}

Si assume che tutti gli elementi della list lst siano di tipo Integer: se cio' non e' vero, il metodo deve lanciare un'eccezione IllegalArgumentException. Il metodo togliMultipli deve togliere dalla lista lst tutti gli oggetti il cui valore e' n oppure un multiplo di n. In particolare se n = 0, dalla lista vengono tolti tutti gli 0. Il metodo restituisce la somma dei numeri contenuti nella lista dopo la rimozione degli elementi.
Per testare la classe TogliMultipli, si compili ed esegua la classe TestTogliMultipli. L'output deve essere ESATTAMENTE il seguente:
 

Provo il metodo TogliMultipli.togliMultipli(int,List)...
Tolgo multipli di 5 da [  7  11  45  -5  0  9  10  6  1  2]
Risultato: [  7  11  9  6  1  2] Somma elementi:  36
Tolgo multipli di 10 da [  11  -5  9  11  6]
Risultato: [  11  -5  9  11  6] Somma elementi:  32
Tolgo multipli di 3 dalla lista vuota
Risultato: [] Somma elementi:  0
Tolgo multipli di 0 da: [  7  0  2  3  0  -4  0]
Risultato: [  7  2  3  -4] Somma elementi:  8
invoco togliMultipli(2,[  3  56  89  bingo!])
Ok: togliMultipli ha lanciato una IllegalArgumentException

Esercizio 3


Scrivere un metodo che, data una lista L contenente istanze della classe Integer, rimuove da L tutti gli elementi di valore pari e li restituisce in una nuova lista.
Testare il metodo con un semplice programma di verifica.

Esercizio 4


  • Scrivere un classe SwapList , che estende la classe LinkedList e contiene i seguenti metodi:
    • public boolean makefirst(Object x) che, dato un oggetto x, modifica la lista su cui viene eseguito spostando l'elemento x, se presente, in prima posizione, restituendo vero se la lista contiene l'elemento, falso altrimenti
    • public boolean swap(Object x, Object y) che, dati due oggetti distinti x, y, scambia la posizione degli elementi x e y, se presenti, nella lista, restituendo vero se la lista contiene gli elementi, falso altrimenti.

    Testare i metodi aggiungendo alla classe un semplice metodo main di verifica.

    Esercizio 5


    Data una lista L contenente istanze dell'interfaccia Comparable, scrivere un metodo per costruire una nuova lista che contenga tutti i massimi locali di L, dove un massimo locale è un elemento x di L tale che il suo predecessore e il suo successore sono entrambi minori di x.
    Testare il metodo con un semplice programma di verifica.


    Esercizio 6


    Sia dato il seguente frammento di programma
     

    import lab2.*;

    public class OrdinaListInv {

         public static List ordina ( List lst ) { 
         // da definire
         }
    }

    Si completi la classe OrdinaListInv, in maniera che il metodo ordina restituisca una lista contenente tutti gli elementi di lst (che si assume siano istanze dell'interfaccia Comparable)  in ordine decrescente e senza ripetizioni.