mercoledì 5 maggio 2010

Java: la classe ArrayList

Avete mai provato a gestire un'array di oggetti? Con un indice si accede all'array e alla posizione scelta si può, quindi, leggere o scrivere il riferimento all'oggetto. Tuttavia, prima di iniziare a lavorare sull'array occorre fissarne la dimensione! Quando l'intero array è stato riempito in ogni sua posizione, per fare posto ad altri oggetti da inserire nella lista occorre, allora, riallocare tutti gli oggetti fin qui inseriti in un array di dimensioni maggiori.
Il pacchetto java.util di Java implementa un utile classe per gli array di oggetti, la classe ArrayList. L'uso di questa classe, per la collezione di oggetti, invece della classica struttura ad array, permette di delegare alla classe stessa la gestione dinamica della lista! Il costruttore della classe costruisce un elenco di array vuoto, se si conoscono le dimensioni iniziali o finali dell'array che ci occorre è poi possibile costruire una lista specificando la sua capacità iniziale. A differenza dell'array classico che provoca in memoria l'allocazione di n voci per gli oggetti, il costruttore della classe ArrayList, non contiene nessun elemento anche dopo la sua istanza. La lista di oggetti cresce dinamicamente, allungandosi quando occorre spazio per memorizzare altri elementi oppure accorciandosi quando gli elementi che prima la caratterizzavano vengono estratti.
Per conoscere il numero di elementi finora presenti nella lista si può invocare sull'oggetto il metodo size(). La classe colleziona oggetti generici, quindi Obejct, pertanto l'estrazione deve sempre essere seguita da un operazione di casting. L'aggiunta di un oggetto alla lista avviene con il metodo add(), il cui parametro è appunto un Object. Esiste un secondo metodo per l'aggiunta di elementi che permette invece di aggiungere gli oggetti in una posizione specifica, fornendo quindi un indice per la posizione (primo parametro). Attenzione, il primo oggetto nella lista ha posizione 0 (come per gli array).
Il riferimento a un oggetto già inserito può essere modificato con il metodo set() che riceve come parametri l'indice di posizione dell'oggetto nella lista e il nuovo riferimento all'oggetto. Per la rimozione dell'oggetto basta invocare il metodo remove() e fornire allo stesso l'indice di posizione dell'oggetto da cancellare. Se invece vogliamo cancellare l'intera lista in un colpo solo è sufficiente ricordarsi del metodo clear().
Quando la dimensione della lista non deve essere più variata (ad esempio quando si è sicuri che non avverranno altre aggiunte) può essere invocato sull'oggetto il metodo trimToSize() che riduce la capacità della lista alle dimensioni che essa effettivamente occupa in memoria (ottimizzandone gli accessi, credo). L'aggiunta di nuovi oggetti alla lista può provocare l'allocazione dinamica di nuovi spazi di memoria se la capacità iniziale è stata superata (che di default, se non indicata, è di 10 oggetti). Tale allocazione è trasparente al programmatore, che non dovrà così preoccuparsi della gestione dinamica della lista. Se si vuole essere sicuri che l'aggiunta di nuovi oggetti avvenga senza riallocare l'array (operazione che potrebbe rallentare un applicazione) bisogna prima chiamare il metodo ensureCapacity() (indicando la capacità di memorizzazione che ci occorre) e successivamente, quindi, il metodo add().
La classe implementa anche alcuni metodi di ricerca di oggetti. Il metodo contains(), ad esempio, ritorna true se l'oggetto passato come parametro si trova nella lista. Con indexOf() e lastIndexOf() è possibile ricevere l'indice di posizione della prima o ultima occorrenza dell'oggetto (passato come parametro) nella lista.
L'ultimo metodo che voglio segnalarvi ci offre la possibilità di ricevere come output un array di oggetti, quali? Quelli finora inseriti nella lista! Provate a invocare il metodo toArray(). Inutile dirlo, altri metodi possono essere trovati consultando la documentazione in linea.



import Magic.*;

import java.util.*;

public class MagicTest {
   public static void main(String args[]) {
      ArrayList deck=new ArrayList();
      Land land1=new Land("Magic",null,null,"bianco");
      Land land2=new Land("Magic",null,null,"bianco");
      Land land3=new Land("Magic",null,null,"bianco");
      Creature creature1=new Creature("Magic",null,null,"bianco",2,2);
      deck.add(land1);
      deck.add(land2);
      deck.add(land3);
      deck.add(creature1);
      System.out.println("Nel deck ci sono "+deck.size()+" carte:");
      Card temp;
      for (int i=0;i<deck.size();i++) {
         temp=(Card)deck.get(i);
         System.out.println(" - "+temp.info());
      }
   }
}

Nessun commento:

Posta un commento