/**
*  La  classe <code>Persona</code> descrive una persona e ha istanze della forma 
*  <em>(nome,cognome)</em>.
*  <BR>
*  Date due persone <em>p1</em>  e <em>p2</em>     diciamo che:
* <ul>
* <li>
*   <em>p1</em>    &egrave; <em>uguale</em> a <em>p2</em>  
* se e solo se 
*  <em>p1</em>  e  <em>p2</em> 
* hanno lo stesso nome e cognome. 
* </li> 
* <li>
*<em>p1</em>   <em>precede </em>   <em>p2</em> 
* (<em>p1</em>  < <em>p2</em>)
* se e solo se
*   <em>p1</em>  precede  <em>p2</em> nell'ordine alfabetico. 
*  Ad esempio:
* <pre>
*    (Mario,Bianchi) <  (Antonio,Rossi)             (Giovanni,Bianchi) < (Mario,Bianchi)
*  </pre>
* </li>
*</ul>
*  La classe  <code>Persona</code> implementa l'interfaccia 
*  <code>Comparable&lt;Persona&gt;</code>.
* Questo significa che deve possedere un metodo  
*  <pre>
*    public  int compareTo(Persona p)
*  </pre>
*  tale che, dati due oggetti   <code>p1</code> e  <code>p2</code>
*  di tipo <code>Persona</code>,  la chiamata
*  <pre>
*     p1.compareTo(p2)
*  </pre>
*  restituisce un numero negativo se   <code>p1 <  p2</code>, 
*  un numero positivo se   <code>p2 <  p1</code>,
* 0 se <code>p1 </code> &egrave; uguale a <code>p2</code>.
* <BR><BR>  
*<B>NOTA</B>
*<BR>
* La classe <code>String</code> implementa l'interfaccia  
*  <code>Comparable&lt;String&gt;</code>,
*  quindi dispone di un metodo  <code>compareTo</code>  per confrontare due stringhe
*(vedere la documentazione).
* <BR>
*  Quando si implementa il metodo  <code>compareTo</code>  della classe  <code>Persona</code>,
* per fare il confronto fra  nome e cognome delle persone 
* va utilizzato  il metodo <code>compareTo</code> della classe  <code>String</code>.
*  
*/




public class Persona implements Comparable<Persona>  {

  // CAMPI

    private String nome; // nome 
    private String cognome;  // cognome
   
  // COSTRUTTORI
  
  /**
   *    Costruisce  una  persona 
   *  avente nome e cognome specificati dagli argomenti.
  */

    public Persona(String nome, String  cognome) {
      this.nome = nome;
      this.cognome = cognome;
     }


  // METODI
  
  
  /**
   *     Restituisce il nome della persona.
   *     @return Il nome della persona che esegue il metodo.
*/

  public String getNome() {
      return this.nome;
  }


  /**
   *    Restituisce il cognome della persona.
   *    @return Il cognome della persona che esegue il metodo.
  */

  public String getCognome() {
    return this.cognome;
  }

/**
 *    Restituisce una stringa che descrive la persona.
 *    @return  Stringa che descrive la persona che esegue il metodo.
*/
  

// riscrive  metodo toString della classe Object

  public String toString(){
      return nome + " " + cognome;
  } 
   
    

  /**
   * Controlla se  la persona  che esegue il metodo 
   *  &egrave;  uguale a quella specificata dall'argomento.
   *
   * @return <code>true</code>  se  la persona  che esegue il metodo 
   * &egrave;  uguale a quella specificato dall'argomento,
   *  <code>false</code> altrimenti.
 */
 

  public boolean equals(Persona p) {    
      return nome.equals(p.nome) && cognome.equals(p.cognome);  
  }



  // riscrive il metodo equals della classe Object

/**
* Controlla  se l'oggetto <code>o</code>  specificato
* dall'argomento  &egrave; una persona
* e la persona  che esegue il metodo  &egrave;  uguale a  <code>o</code>.
* 
*  @return  <code>true</code>  se  la persona  che esegue il metodo 
* &egrave;  uguale a quella specificata dall'argomento,
* <code>false</code> altrimenti.
*/
 
  

    public boolean equals(Object o) {
        if (o instanceof Persona){
	    Persona p = (Persona) o;
	    return this.equals(p); // chiama metodo equals(Persona) definito sopra
        }
        else return false;
    }
    



  
 
  /** 
* Implementa il metodo <code>compareTo</code> dell'interfaccia
*  <code>Comparable&lt;Persona&gt;</code> confrontando le persone
* in base all'ordine alfabetico.
*
*   
*  @return  un numero negativo se la persona che esegue il metodo precede 
*   (nell'ordine alfabetico) la persona
*   <code>p</code>  specificata dall'argomento, 0 se le due persone  sono uguali,
*  un numero positivo  se   <code>p</code>  precede la persona che esegue il metodo. 
*/  

   

    public int compareTo(Persona p){
   /* Prima si confronta this.cognome e p.cognome.
      Se i cognomi sono uguali, occorre confrontare il nome.  */
	
	int cognomeCmp = this.cognome.compareTo(p.cognome); 
	return ( cognomeCmp != 0 )  ?  cognomeCmp :  (this.nome).compareTo(p.nome) ;
	/* EQUIVALE A
	   if (cognomeCmp != 0 )
                  return  cognomeCmp;
           else   // cognomi uguali 
                  return (this.nome).compareTo(p.nome);
   */
    }
  



  
  
}// end class
	

