Java: le Liste, rimuovere oggetti in testa e in coda – Parte III


Come rimuovere oggetti in testa e in coda alla lista utilizzando le eccezioni per monitorare e gestire le rimozioni sul liste vuuote.

Per continuare la spiegazione sulle liste e apliarne le funzionalità aggiungeremo altri due metodi:
rimuoviInTesta e rimuoviInCoda, che permetteranno rispettivamente di eliminare un intero all’inizio o alla fine della nostra lista.

Come sempre le classi rimangono le stesse di quelle mensionate in Java: Liste Parte I e Java: Liste Parte II, dunque quelle che seguono sono solo aggiunte alle cose già viste e spiegate.

La novità consiste nell’uso delle eccezioni, un meccanismo che ci permette di monitorare il tentativo di rimuovere un elemento da una lista vuota, l’eccezione catturata verrà quindi risolta nel modo che vedremo.

Per iniziare modifichiamo la classe Lista.java aggiungendo questi metodii:

…………
…………

//Rimuove il primo nodo della lista
public int rimuoviInTesta() throws EccezioneListaVuota{

if(isEmpty()) //lancia un eccezione se la lista è vuota
throw new EccezioneListaVuota(nome);

int elemRim = primoNodo.dato; // ottiene i dati da rimuovere

//aggiorna i riferimenti primoNodo e ultimoNodo

if(primoNodo == ultimoNodo)
primoNodo = ultimoNodo = null; //c’era un unico nodo
else
primoNodo = primoNodo.nextNodo; //scorro di uno e elimino la testa

return elemRim; //ritorna i dati del nodo rimosso
}

//rimuove l’ultimo nodo della lista
public int rimuoviInCoda() throws EccezioneListaVuota {

if(isEmpty()) //lancia un eccezione se la lista è vuota
throw new EccezioneListaVuota(nome);

int elemRim = ultimoNodo.dato; //ottiene i dati da rimuovere

//aggiorna i riferimenti primoNodo e ultimoNodo

if(primoNodo == ultimoNodo)
primoNodo = ultimoNodo = null;
else { //localizza l’attuale ultimo nodo

NodoLista corrente = primoNodo; //salvo la testa

//itera finchè il nodo corrente punta a ultimoNodo
while(corrente.nextNodo != ultimoNodo)
corrente = corrente.nextNodo;

//elimino l’ultimo nodo perchè faccio puntare ultimoNodo al penultimo nodo
ultimoNodo = corrente;
corrente.nextNodo = null;

} //fine else

return elemRim; //ritorna i dati del nodo rimosso;
}

Fatto ciò salviamo il file Lista.java e rechiamoci nel main che si trova nel file TestaLista.java e aggiungiamo questo pezzo di codice alla fine del metodo main:

………………….
………………….
//rimuove degli oggetti dalla lista; effettua una stampa dopo ogni rimozione

try {
int oggettoRimosso = lista.rimuoviInTesta();
System.out.printf(“%d rimosso\\n”, oggettoRimosso);
lista.stampaContenuto();

oggettoRimosso = lista.rimuoviInTesta();
System.out.printf(“%d rimosso\\n”, oggettoRimosso);
lista.stampaContenuto();

oggettoRimosso = lista.rimuoviInCoda();
System.out.printf(“%d rimosso\\n”, oggettoRimosso);
lista.stampaContenuto();

oggettoRimosso = lista.rimuoviInCoda();
System.out.printf(“%d rimosso\\n”, oggettoRimosso);
lista.stampaContenuto();
} //fine try
catch (EccezioneListaVuota listaVuota)
{
listaVuota.printStackTrace();
} //fine catch
……………………..
……………………..

Notiamo una novità il blocco try-catch usato al fine di monitorare (nel blocco try) una possibile eccezione, ossia il verificarsi di un evento anomalo, come in questo caso la rimozione di un elemento da una lista vuota (che nel caso si verifichi verrà catturato da catch e verranno svolte le dovute procedure).

Dobbiamo aggiungere dunque un’altra classe per fare in modo di non far terminare in maniera anomala il nostro programma ma di comunicare all’utente l’azione “proibita” che si sta tentando di fare cercando di svolgere un’esecuzione “pulita”.

Il file viene salvato come EccezioneListaVuota.java

// Definizione della classe EccezioneListaVuota

public class EccezioneListaVuota extends RuntimeException {

//costruttore senza argomenti
public EccezioneListaVuota() {

this(“Lista”); //chiama l’altro costruttore di EccezioneListaVuota
}

//costruttore con un argomento
public EccezioneListaVuota(String nome) {

super(nome + ” e’ vuota!”); //chiama il costruttore della superclasse
}

}

Compiliamo questo file e ricompiliamo gli altri, per eseguire lanciare TestaLista.java

🙂

Please follow and like us: