next up previous
Next: Gestione dinamica della memoria Up: Unità 11 Previous: Limitazioni degli array

Gestione della dimensione di un array

Alcune di tali limitazioni possono essere superate gestendo in maniera opportuna gli array, in modo da allocare sufficiente memoria per contenere i dati dell'applicazione dinamicamente durante l'esecuzione del programma.

L'esempio seguente mostra una classe per la gestione di una lista di persone (oggetti della classe Persona), che gestisce la dimensione di un array dinamicamente.

 
public class ListaPersoneConArray {
   private Persona[] a;
   private int n;

   public ListaPersoneConArray() {
      a = new Persona[10];
      n = 0;
   }

   public void add (Persona p) {
      if (n==a.length) {
         // L'array e' pieno!!!
         // Bisogna creare un nuovo array piu' grande
         // e copiare tutti gli elementi
         Persona[] b = new Persona[a.length*2];
         for (int i=0; i<a.length; i++)
            b[i] = a[i];
         a = b;
      }
      // Ora siamo sicuri che n < a.length
      a[n] = p;
      n++;
   }

   public void remove (int k) {
      if ((k>=0) && (k<n)) {
         // Dobbiamo spostare tutti gli elementi successivi a k
         for (int i=k; i<n; i++) 
             a[i] = a[i+1];
         n--;
      }
      // Riduciamo la dimensione dell'array se e' sufficientemente 
      // vuoto
      if ((a.length>10) && (n < a.length/4)) {
         Persona[] b = new Persona[a.length/2];
         for (int i=0; i<n; i++)
            b[i] = a[i];
         a = b;
      }
   }
}

Si noti che la gestione dinamica dell'array non avviene modificando dinamicamente la sua dimensione (cosa peraltro non possibile), ma creando nuovi array più grandi o più piccoli a seconda delle esigenze e copiando tutti i valori nel nuovo array ogni volta che ciò è necessario. La dimensione dei nuovi array creati dinamicamente viene raddoppiata in caso in cui sono necessarie altre componenti o dimezzata nel caso in cui l'array è sufficientemente vuoto. La scelta di considerare l'array sufficientemente vuoto se n < a.length/4 consente di minimizzare le operazioni di creazione di nuovi array in quanto il nuovo array ridotto sarà pieno per non più della metà della sua capacità.


next up previous
Next: Gestione dinamica della memoria Up: Unità 11 Previous: Limitazioni degli array