package utilita;

class Nodo{
  Confrontabile info;
  Nodo next;
}


public class CollezioneOrdinata {
  //Rappresentazione degli oggetti
  private Nodo init;
  
  //Costruttori
  public CollezioneOrdinata() { //in realta' possiamo evitare di 
                                //definire questo costruttore
                                //visto che opera come il
                                //costruttore di default
    init = null;
  }

  //metodi pubblici
  public void inserisci(Confrontabile c) {
    Nodo gen = new Nodo(); //nodo generatore
    gen.next = init;
    init = gen;
    Nodo l  = init;
    while(l.next!=null && l.next.info.confrontaCon(c)<0)
      l=l.next;

    if (l.next != null && l.next.info.confrontaCon(c) == 0) {
      //non fare niente
    }
    else { // l.next==null || l.next.info.confrontaCon(c)>0 -- c non presente
      Nodo aux = new Nodo(); //inserisci nuovo nodo
      aux.info = c;
      aux.next = l.next;
      l.next = aux;
    }
    init = init.next; //elimina nodo generatore
  }
  

  public void elimina(Confrontabile c) {
    Nodo gen = new Nodo(); //nodo generatore
    gen.next = init;
    init = gen;
    Nodo l  = init;
    while (l.next!=null && l.next.info.confrontaCon(c)<0) 
      l=l.next;

    if (l.next != null && l.next.info.confrontaCon(c)==0)
      l.next = l.next.next; //elimina nodo
    //else l.next==null || l.next.info.confrontaCon(c)>0 -- c non presente
    //   non fare nulla

    init = init.next; //elimina nodo generatore
  }

  public int posizione(Confrontabile c) { 
    Nodo l  = init;
    int pos = 0;
    while (l!=null && l.info.confrontaCon(c)<0){ //la lista e' ordinata!
      pos++;
      l=l.next;
    }

    if (l!=null && l.info.confrontaCon(c) == 0)
      return pos; 
    else // l==null || l.info.confrontaCon(c)>0 -- c non presente
      return -1;
  }

  public Confrontabile elementoInPosizione(int n) {
    if (n>=quantiElementi() || n<0)
      return null;
    else {
      Nodo l  = init;
      for(int i =0; i<n; i++)
        l=l.next;      
      return l.info; 
    }
  }

  public int quantiElementi() {
    Nodo l = init;
    int cont = 0;
    while (l!=null){
      cont++;
      l = l.next;
    }
    return cont;
  }

  public Confrontabile[] tuttiGliElementi() {
    Confrontabile[] ris = new Confrontabile[quantiElementi()];
    Nodo l = init;
    for (int i = 0; i < ris.length; i++) {
      ris[i] = l.info;
      l = l.next;
    }
    return ris;
  }

}

