[bottega] [REPOST] [mmirra@libero.it: Re: ti mando l'esercizio]

  • From: Massimiliano Mirra <mmirra@xxxxxxxxx>
  • To: bottega@xxxxxxxxxxxxx
  • Date: Fri, 20 Dec 2002 18:46:11 +0100

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 -----

Other related posts:

  • » [bottega] [REPOST] [mmirra@libero.it: Re: ti mando l'esercizio]