import java.util.*;


/**
 * Una <code>RubricaTelefonica</code>  &egrave; una collezione di contatti.
 *  <BR>
 * Una rubrica non  pu&ograve; contenere   contatti uguali
 *  (l'uguaglianza fra contatti &egrave; quella  definita nella classe <code>Contatto</code>). 
 * <ul>
 *<li> La collezione di contatti &egrave; rappresentata dal campo privato
 *<code>elencoContatti</code> che ha tipo  <code>List&lt;Contatto&gt;</code>.
 *<BR> 
*  L'interfaccia   <code>List&lt;E&gt;</code>  
*(da non confondere  con la classe concreta <code>List</code>)
* estende l'interfaccia  <code>Collection&lt;E&gt;</code>.
* Come spiegato sotto, le API Java permettono di ordinare
*collezioni di tipo  <code>List&lt;E&gt;</code>.
*<BR><BR>
*<b> NOTA</b>&nbsp;&nbsp;  
* <code>RubricaTelefonica</code>  non &egrave; 
*sottotipo di  <code>List&lt;Contatto&gt;</code>,
*in quanto  <code>RubricaTelefonica</code> non implementa 
* l'interfaccia   <code>List&lt;Contatto&gt;</code>.
* 
*
* 
* </li> 
*<BR>
 *<li> 
 *Poich&eacute; nella rubrica non sono  ammessi duplicati,
*  prima di aggiungere un contatto <code>cont</code>   occore controllare
 *  che <code>cont</code> non sia gi&agrave; nella rubrica.
 * <BR>
 * Si pu&ograve; usare  il metodo 
 *<pre>
 *  boolean contains(Object o)
 *</pre>
 *definito nell'interfaccia  <code>Collection&lt;E&gt;</code> (e quindi ereditato
 *  da <code>List&lt;E&gt;</code>).
 *<BR> 
 * La definizione del metodo  <code>contains</code> nella documentazione &egrave; la seguente: 
 *<BR><BR> 
* <table bgcolor= #F0F0F0   cellspacing="4" cellpadding="5" border="1" width="84%" frame=box>
*<TR>
 * <TD> Returns <tt>true</tt> if this collection contains the specified element.
 *<BR> 
* More formally, returns <tt>true</tt> if and only if this collection
 * contains at least one element <tt>e</tt> such that
 * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
 * </TR>
 * </TD> 
 *</table>
 *<BR>
 * Quindi, se <code>coll</code> &egrave; un oggetto di tipo
 * <code>Collection&lt;E&gt;</code> e <code>o</code> &egrave; un oggetto 
 * di tipo <code>E</code>, la chiamata 
 *<pre> 
 *    coll.contains(o)
 *</pre>
 * restituisce <code>true</code> se e solo se vale una delle seguenti due condizioni:
 *<ol type="i">
 *<li>
 *  <code>o</code> &egrave;  <code>null</code>
*  e   <code>null</code> &egrave; un elemento di  <code>coll</code>;
* </li>
 *<li>
 *  <code>o</code> &egrave; diverso da  <code>null</code>
* e  <code>coll</code> contiene almeno    un elemento   <code>e</code> 
* tale che   <code>o.equals(e)</code> restituisce <code>true</code>.
*</li>
*</ol>
 *</li>
 * 
*<BR>
 *<li>
 *La classe <code>RubricaTelefonica</code> implementa l'interfaccia
 *<code>Iterable&lt;Contatto&gt;</code>.
 * Deve quindi definire un metodo
 *<pre>
 *   public Iterator&lt;Contatto&gt; iterator()
 *</pre>
 *che restituisce un  iteratore per i contatti nella rubrica.
 *<BR>
 * Sull'iteratore restituito dal metodo  <code>iterator</code>
 * &egrave; possibile eseguire il ciclo <em>for-each</em>.
 *<BR><BR>
*<b> NOTA</b>&nbsp;&nbsp;    
 *Quando si  sta attraversando una collezione con un iteratore, la collezione non
 * pu&ograve; essere  modificata. 
 * Ad esempio, il codice
 *<pre>
 * Iterator&lt;Contatto&gt;  it = elencoContatti.iterator(); // definisce un iteratore per elencoContatti
 * // ciclo che cancella tutti i contatti in  elencoContatti
 * while(it.hasNext()){     // termina quando in it non ci sono piu' elementi 
 *       Contatto cont = it.next();       // prossimo elemento nell'iteratore
 *       elencoContatti.remove(cont);     // togli da  elencoContatti il contatto cont
 *  }
 * 
*</pre>
* &egrave; compilato, ma solleva in esecuzione l'eccezione
*<pre>
*   java.util.ConcurrentModificationException
*</pre>
* in quanto, finch&eacute; il ciclo che utilizza l'iteratore <code>it</code> non &egrave; terminato, 
* la collezione <code> elencoContatti</code> non  pu&ograve; essere modificata.
*  <BR>
 *Occorre invece usare   il metodo <code>remove</code> dell'interfaccia  <code>Iterator&lt;E&gt;</code>:
 *<pre>
 * ...
 * while(it.hasNext()){  
 *      Contatto cont = it.next(); 
 *      it.remove();    // elimina dall'iteratore l'elemento corrente 
 *      numeroContatti--;
 *  }
*  // gli elementi eliminati dall'iteratore sono eliminati anche da elencoContatti
*</pre>
 *<BR>
 * Si ricordi che il ciclo  <em>for-each</em>  utilizza implicitamente
 *un iteratore, quindi una collezione attraversata con tale ciclo non
* pu&ograve; essere modificata.
*</li>
 *
 *<BR>
 *<li>  
 *Poich&eacute;  la classe   <code>Contatto</code> implementa l'interfaccia
 *  <code>Comparable&lt;Contatto&gt;</code>, &egrave; possibile ordinare i
 * contatti usando il metodo statico
 *<pre>
 *    public static &lt;T extends Comparable&lt;? super T&gt;&gt; void sort(List&lt;T&gt; list)
 *</pre> 
* della classe <code>Collections</code> (da non confondere con l'interfaccia
* <code>Collection&lt;E&gt;</code>).
*<BR>
* La definizione del metodo  <code>sort</code> richiede che:
*<ul>
*<li>
* L'argomento  deve essere un oggetto che implementa
*  l'interfaccia <code>List&lt;T&gt;</code>. 
*</li><Li>
* Il tipo <code>T</code> deve essere un sottotipo di 
* <code>Comparable&lt;S&gt;</code>, dove <code>S</code>
* &egrave; un supertipo di  <code>T</code>.
*<BR>
* Questo serve per garantire che  sugli oggetti della lista argomento sia  definito il
* metodo <code>compareTo</code>   (usato dal metodo   <code>sort</code>
* per ordinare gli elementi della lista).
*</li>
*</ul>
*Nel nostro caso  <code>T</code>  &egrave; la classe <code>Contatto</code> ed entrambe
* le condizioni sono verificate
*in quanto <code>Contatto</code> implementa l'interfaccia <code>Comparable&lt;Contatto&gt;</code>.
* L'ordinamento viene fatto in base alla definizione del metodo <code>compareTo</code>
* della classe  <code>Contatto</code>.
*</li>
*</ul>
*/

public class RubricaTelefonica implements Iterable<Contatto>{
	
  // CAMPI


    private List<Contatto> elencoContatti; // collezione dei contatti nella rubrica
    private int numeroContatti;  // numero dei contatti nella rubrica


 // COSTRUTTORI 
  
  /**
     Costruisce una rubrica telefonica  vuota.  
  */ 

  public RubricaTelefonica() {
      // occorre inizializzare i campi della classe
  }


 /**
  * Se il contatto specificato dall'argomento   non &egrave; nella rubrica 
  * che esegue il metodo lo aggiunge, 
  * altrimenti  non compie alcuna operazione.
  *
*/


  /* per controllare  se cont e' nella rubrica, usare il metodo contains definito nell'interfaccia List<E>
     Ricordarsi di aggiornare   numeroContatti

   */

    public  void addContatto(Contatto cont) {

    }
 


 /**
*     Restituisce il numero complessivo di contatti  nella rubrica che esegue il metodo.
*
*/


    public int getNumeroContatti(){
	return numeroContatti;
    }


 /**
*     Restituisce un iteratore per i contatti  della rubrica che esegue il metodo.
*
*/

 // implementa il metodo iterator richiesto dall'interfaccia Iterable<E>
   

    // e' sufficiente chiamare il metodo iterator definito in Collcection<E>

  public Iterator<Contatto> iterator() {
      return null;
  }


/**
*    Ordina la  rubrica che esegue il metodo.
*
*/

// usare il metodo statico sort della classe Collections 

public void ordina(){

}







}// end class
