import java.util.*;
/**
 *  Visione semplificata di un'Anagrafe
 *
 * @author     Antonio Terreno
 * @created    23 maggio 2002
 */
public class Persona implements Comparabile {

        /**
         *  Array di tutte le persone
         */
        public static Persona[] arrayOfPersona;

        private static int numerazionePersone;

        private String nomePersona;
        private String cognomePersona;
        private int codiceFiscalePersona;

        static {
                arrayOfPersona = new Persona[99];
        }


        /**
         *Costruttore dell'oggetto Persona
         *
         * @param  nome     Nome della persona
         * @param  cognome  Cognome della persone
         */
        public Persona(String nome, String cognome) {
                nomePersona = nome;
                cognomePersona = cognome;
                arrayOfPersona[numerazionePersone] = this;
                codiceFiscalePersona = nome.hashCode() + cognome.hashCode();
                numerazionePersone += 1;
        }


        /**
         *  Restituisce l'attributo numerazionePersone della classe Persona
         *
         * @return    Il valore di numerazionePersone
         */
        public static int getNumerazionePersone() {
                return numerazionePersone;
        }


        /**
         *  Restituisce l'indice dell'ultima persona inserita nell'array
         *
         * @return    L'indice dell'ultima persona inserita nell'array
         */
        public static int getIndiceUltimaPersona() {
                return numerazionePersone - 1;
        }


        /**
         *  Restituisce l'attributo codiceFiscale dell'oggetto Persona
         *
         * @return    Il valore di codiceFiscale
         */
        public int getCodiceFiscale() {
                return codiceFiscalePersona;
        }


        /**
         *  Restituisce l'attributo nome dell'oggetto Persona
         *
         * @return    Il valore di nome
         */
        public String getNome() {
                return nomePersona;
        }


        /**
         *  Restituisce l'attributo cognonome dell'oggetto Persona
         *
         * @return    Il valore di cognome
         */
        public String getCognome() {
                return cognomePersona;
        }


        /**
         *  Stampa dell'oggetto Persona
         *
         * @return    Stampa dell'oggetto Persona
         */
        public String toString() {
                return
                                "\n____________________________________________________"
                                 + "\n Nome:           " + this.getNome()
                                 + "\n Cognome:        " + this.getCognome()
                                 + "\n Codice Fiscale: " + this.getCodiceFiscale()
                                 + "\n____________________________________________________";
        }


        /**
         *  Applica la stampa a tutti gli oggetti dell'array arrayOfPersona
         */
        public static void stampaTutti() {
                int i;
                for (i = 0; i < numerazionePersone; i++) {
                        System.out.println(arrayOfPersona[i]);
                }
        }


        /**
         *  Confronta oggetti di tipo Persona in base al loro codiceFiscale
         *
         * @param  ob                        oggetto
         * @return                           1,-1,0 a seconda che un'oggetto sia &lt;, &gt; o = ad ob
         * @exception  ClassCastException    Eccezione di tipo ClassCast
         * @exception  NullPointerException  Description of the Exception
         */
        public int compara(Comparabile ob) throws ClassCastException {
                Persona altraPersona = (Persona) ob;
                if (this.getCodiceFiscale() < altraPersona.getCodiceFiscale()) {
                        return -1;
                }
                if (this.getCodiceFiscale() > altraPersona.getCodiceFiscale()) {
                        return 1;
                }
                return 0;
        }


        /**
         * @param  args  Eventuali argomenti
         */
        public static void main(String args[]) {

                Persona p1 = new Persona("Antonio", "Terreno");
                Persona p2 = new Persona("Paolo", "Rossi");
                Persona p3 = new Persona("Simona", "Deagostini");
                Persona p4 = new Persona("Mario", "Rossi");

                Persona.stampaTutti();
                System.out.println("\nDopo l'ordinamento...");
                try {
                        SortArray.sort(Persona.arrayOfPersona,getIndiceUltimaPersona());
                } catch (ClassCastException cce) {
                } catch (NullPointerException npe) {
                }

                Persona.stampaTutti();

        }

}