Ho visto sul computer di Filippo che il sorgente Java in Outlook viene mostrato senza indentazione. Rimando l'esercizio commentato sostituendo gli spazi ai tabulatori, fatemi sapere se questo risolve il problema... ----- Forwarded message from Massimiliano Mirra <mmirra@xxxxxxxxx> ----- From: Massimiliano Mirra <mmirra@xxxxxxxxx> To: bottega@xxxxxxxxxxxxx Subject: [bottega] Re: ti mando l'esercizio On Wed, Dec 11, 2002 at 07:58:36PM +0100, votrusso wrote: > Sono Tommaso Russo Massimiliano ti mando l'esercizio che ho fatto pare > che vada bene quardalo e dacci un occhiata confermami che va bene e Ciao Tommaso, ti rispondo qui cosi` gli altri possono giovarne. L'esercizio era di ordinare un elenco di clienti alfabeticamente secondo il nome. Ciascun cliente e` rappresentato da un oggetto di classe Cliente; i clienti sono conservati in un vettore; l'algoritmo da usare e` l'insertion sort. Il tuo svolgimento e` corretto, i clienti vengono stampati con i nomi in ordine alfabetico. Lo riporto qui sotto per intero, poi lo commento brano a brano suggerendo delle migliorie. Ecco l'esercizio: import java.util.*; class Cliente { public Cliente(String nome,String cognome) { this.nome=nome; this.cognome=cognome; } public String nome; public String cognome; public int compareTo(Cliente cl) { if(this.nome.compareTo(cl.nome)>0) { return 1; } else if(this.nome.compareTo(cl.nome)<0) { return -1; } else { return 0; } } } public class InsertionSort { public static void main(String[] argv)throws Exception { Cliente cl1=new Cliente("tommaso","russo"); Cliente cl2=new Cliente("marco","miccolupi"); Cliente cl3=new Cliente("roberto","vicci"); Cliente cl4=new Cliente("cosimo","rossi"); Cliente cl5=new Cliente("carmine","izzo"); Vector v1=new Vector(); v1.addElement(cl1); v1.addElement(cl2); v1.addElement(cl3); v1.addElement(cl4); v1.addElement(cl5); Vector v2=new Vector(); for(int i=0;i<v1.size();i++) { Cliente cl=(Cliente)v1.elementAt(i); if(v2.size()==0) { v2.addElement(cl); } else { Cliente primocl=(Cliente)v2.elementAt(0); if(primocl.compareTo(cl)>0) { v2.insertElementAt(cl,0); } else { Cliente ultimocl=(Cliente)v2.elementAt(v2.size()-1); if(ultimocl.compareTo(cl)<0) { v2.addElement(cl); } else { for(int j=0;j<v2.size()-1;j++) { Cliente sinistrocl=(Cliente)v2.elementAt(j); Cliente destrocl=(Cliente)v2.elementAt(j+1); if(sinistrocl.compareTo(cl)<0) { if(destrocl.compareTo(cl)>0) { v2.insertElementAt(cl,j+1); break; } } } } } } } stampa(v2); } public static void stampa(Vector v2) { System.out.println("Elenco ordinato in base al nome:"); System.out.println(); for(int k=0;k<v2.size();k++) { Cliente stampacl=(Cliente)v2.elementAt(k); System.out.println(stampacl.nome+" "+stampacl.cognome); } } } // COMMENTI SULLA CLASSE CLIENTE class Cliente { public Cliente(String nome,String cognome) { this.nome=nome; this.cognome=cognome; } // Queste variabili di istanza sono pubbliche. Cio` puo` essere // un problema, perche' non vogliamo che altri possano modificare // nome e cognome di un cliente. public String nome; public String cognome; // Possiamo fare due cose: // // 1) lasciare le variabili pubbliche, ma dichiararle `final'. // Cio` significa che, una volta impostate nel costruttore, // nessuno potra` piu` modificare il loro valore, ne' // dall'interno, ne' dall'esterno: public final String nome, cognome; // 2) dichiarare la variabili come private, e creare dei metodi // `lettori' per renderle disponibili all'esterno in sola lettura: private String nome, cognome; public String getNome() { return nome; } public String getCognome() { return cognome; } // Questo metodo serve a comparare due oggetti di classe Cliente // in base al cognome: // // int result = cliente1.compareTo(cliente2) // // result e` maggiore, minore o uguale a zero, a seconda che il // cognome di cliente1 sia maggiore, minore o uguale a quello del // secondo. public int compareTo(Cliente cl) { if(this.nome.compareTo(cl.nome)>0) { return 1; } else if(this.nome.compareTo(cl.nome)<0) { return -1; } else { return 0; } } // Da notare che il comportamento di compareTo sulle stringhe e` // uguale, quindi si sarebbe potuto scrivere piu` brevemente: public int compareTo(Cliente c) { int result = nome.compareTo(c.nome); return result; } // O ancora piu` brevemente: public int compareTo(Cliente c) { return nome.compareTo(c.nome); } // Naturalmente, se invece di variabili di istanza avessimo avuto // metodi lettori, avremmo scritto cosi`: public int compareTo(Cliente c) { return nome.compareTo(c.getNome()); } } // COMMENTI SULL'IMPLEMENTAZIONE DELL'INSERTION SORT public class InsertionSort { public static void main(String[] argv)throws Exception { // Ricordate il selection sort? Tutto si svolgeva in un solo vettore. // L'insertion sort e` diverso: c'e` un vettore di partenza, non // ordinato, e un vettore di destinazione, che viene riempito secondo // un criterio, in modo che, alla fine dell'operazione, risulti // ordinato. // // Alla fine del procedimento, il vettore di partenza e` ancora come // era all'inizio. // // Qui creiamo e riempiamo il vettore di partenza: Cliente cl1=new Cliente("tommaso","russo"); Cliente cl2=new Cliente("marco","miccolupi"); Cliente cl3=new Cliente("roberto","vicci"); Cliente cl4=new Cliente("cosimo","rossi"); Cliente cl5=new Cliente("carmine","izzo"); Vector v1=new Vector(); v1.addElement(cl1); v1.addElement(cl2); v1.addElement(cl3); v1.addElement(cl4); v1.addElement(cl5); // Qui creiamo il vettore di destinazione... Vector v2=new Vector(); // ...e lo riempiamo secondo questo procedimento: // - prendiamo un elemento alla volta dal vettore di partenza; for(int i=0;i<v1.size();i++) { Cliente cl=(Cliente)v1.elementAt(i); // - se il vettore di destinazione e` vuoto, inseriamo // l'elemento appena preso, senza troppe cerimonie; if(v2.size()==0) { v2.addElement(cl); } else { // - altrimenti, se l'elemento appena preso e` minore // del primo elemento del vettore, inseriamolo prima // (il primo elemento e tutti gli altri slitteranno); Cliente primocl=(Cliente)v2.elementAt(0); if(primocl.compareTo(cl)>0) { v2.insertElementAt(cl,0); } else { // - altrimenti, se l'elemento appena preso e` // maggiore dell'ultimo, aggiungiamolo alla fine Cliente ultimocl=(Cliente)v2.elementAt(v2.size()-1); if(ultimocl.compareTo(cl)<0) { v2.addElement(cl); } else { // altrimenti percorriamo tutto il vettore di // destinazione, cercando i due elementi tra i // quali va inserito quello appena preso for(int j=0;j<v2.size()-1;j++) { Cliente sinistrocl=(Cliente)v2.elementAt(j); Cliente destrocl=(Cliente)v2.elementAt(j+1); if(sinistrocl.compareTo(cl)<0) { if(destrocl.compareTo(cl)>0) { v2.insertElementAt(cl,j+1); break; } } } } } } } // Qui viene stampato il vettore. stampa(v2); // Un alternativa piu` leggera sarebbe stata: System.out.println(v2); // Cio` pero` sarebbe risultato in qualcosa come: // // [Cliente@12523, Cliente@98038, Cliente@12310] // // ...perche' la classe cliente non ridefisce il metodo // toString(), che quindi mantiene il comportamento definito // nella superclasse Object. } public static void stampa(Vector v2) { System.out.println("Elenco ordinato in base al nome:"); System.out.println(); for(int k=0;k<v2.size();k++) { Cliente stampacl=(Cliente)v2.elementAt(k); System.out.println(stampacl.nome+" "+stampacl.cognome); } } } ----- End forwarded message -----