import javabooklet.*;

/**
  La raccolta di metodi della classe IntArrayUtil trasformata
  nello stile della programmazione a oggetti in una classe che permette
  di creare oggetti-array forniti di metodi utili,
  e che possono essere "riempiti anche solo parzialmente ";

*/

public class IntArrayParziale {

  private static final int DEFAULT_LUNGHEZZA_MAX = 10;
  private int[] elementi;
  private int numElementi; // numero elementi effettivi, o size

/**
costruttore che prende come argomento un oggetto
di tipo array di interi "nudo e crudo"
e costruisce un oggetto della classe IntArrayParziale
contenente tale array di interi
*/
  public IntArrayParziale(int[] elementi) {
    this.elementi = elementi;
    numElementi = elementi.length;
  }

/**
costruttore che prende come argomento
un intero positivo
e costruisce un oggetto della classe IntArrayParziale
contenente un array di lunghezza uguale all'argomento,
i cui elementi devono ancora essere "riempiti"
*/
  public IntArrayParziale(int lunghezzaMax) {
    elementi = new int[lunghezzaMax];
    numElementi = 0;
  }

  public IntArrayParziale() {
    elementi = new int[DEFAULT_LUNGHEZZA_MAX];
    numElementi = 0;
  }

  public int capacity() {
    return elementi.length;
  }

  public int size() {
    return numElementi;
  }

  /**
   metodo che fa l'input di una sequenza di numeri
   e la memorizza nell'array dall'inizio, cancellando
   l'eventuale sequenza precedentemente contenuta
  */
  public void leggiIniziale() {
    int inputVal;
    for(numElementi=0; numElementi < elementi.length; numElementi++) {
      inputVal = OptionIO.getInt("immetti un intero; per terminare la sequenza clicca Annulla");
      if(OptionIO.isCanceled()) return;
      elementi[numElementi] = inputVal;
    }
    OptionIO.showMessageDialog("array pieno");
  }

/**
metodo che aggiunge un elemento all'array
parzialmente riempito,
mettendolo in ultima posizione;
il metodo restituisce true se l'aggiunta del
nuovo elemento è andata a buon fine;
se invece l'array era già completamente pieno,
il metodo non fa nulla ma restuisce false per
segnalare al chiamante che l'aggiunta del nuovo
elemento non è andata a buon fine
*/
  public boolean add(int val) {
    if(numElementi == elementi.length) {
      OptionIO.showMessageDialog("Capacity insufficiente");
      return false;
    }
    elementi[numElementi++] = val;
    return true;
  }


  public void scriviSuConsolle() {
    System.out.println("l'array e': ");
    for(int i=0; i < numElementi; i++) {
      System.out.println(elementi[i]);
    }
  }

  public void scriviSuMessageDialog() {
    String output = "l'array è:  ";
    for(int i=0; i < numElementi; i++) {
      output = output + elementi[i] + "  ";
    }
    OptionIO.showMessageDialog(output);
  }

  public void scriviSuOutputBox() {
    OutputBox output = new OutputBox();
    for(int i=0; i < numElementi; i++) {
      output.print(elementi[i] + "  ");
    }
    output.waitUntilClose();
  }

  public boolean ricerca(int val) {
    int n = numElementi;
    for(int i=0; i < n; i++) {
      if(elementi[i] == val) return true;
    }
    return false;
  }

  public boolean ricercaWh(int val) {
    int i = 0;
    int n = numElementi;
    while(i < n && elementi[i] != val) i++;
    return i < n;
  }

  public int ricercaIndice(int val) {
    int n = numElementi;
    for(int i=0; i < n; i++) {
      if(elementi[i] == val) return i;
    }
    return -1;
  }

  public int ricercaIndiceWh(int val) {
    int i = 0;
    int n = numElementi;
    while(i < n && elementi[i] != val) i++;
    if(i < n) return i; else return -1;
  }

  public boolean èOrdinato() {
    int n = numElementi;
    int i = 1;
    while(i < n && elementi[i-1] <= elementi[i]) i++;
    return i==n;
  }


 /**
 ricerca nell'array il primo elemento uguale a x
 e lo elimina, compattando l'array e mantenendo l'ordine
 degli elementi
 */
  public void eliminaPrimo(int x) {
    int i = ricercaIndice(x);
    if(i != -1) {
      for(int j = i+1; j < numElementi; j++) {
        elementi[j-1] = elementi[j];
      }
      numElementi --;
    }
  }

 /**
 elimina tutti gli elementi uguali a x, compattando l'array,
 e mantenendo l'ordine degli elementi,
 senza usare array ausiliari
 */
  public void eliminaTutti(int x) {
    int i = 0, j = 0;
    while(i < numElementi) {
      if(elementi[i] != x) {
        elementi[j] = elementi[i];
        j++;
      }
      i++;
    }
    numElementi = j;
  }
}

