Uso di vettori
Invece di un array spesso è più comodo utilizzare un oggetto della classe Vector
.
A volte ci si riferisce a Vector
con il termine vettore.
Gli oggetti della classe Vector
rispetto agli array hanno notevoli vantaggi:
-
le loro dimensioni possono variare in modo dinamico, in base alle necessità;
-
permettono di eseguire facilmente le operazioni di inserimento e cancellazione di elementi (gli altri elementi vengono shiftati automaticamente);
-
con la genericità permettono di specificare il tipo di oggetti che devono contenere.
I Vector
possono contenere solo oggetti e non tipi primitivi. Questo problema però può essere facilmente risolto usando le classi corrispondenti (classi involucro).
Si consiglia di usare:
-
array se si devono memorizzare valori di tipo primitivo, se l’array è bidimensionale o se si deve ottenere la massima efficienza;
-
vettori in tutti gli altri casi.
La classe Vector
Costruttori
-
Vector()
crea un vettore vuoto con dimensione iniziale 10 e incremento di capacità 0; -
Vector(int initialCapacity, int capacityIncrement)
crea un vettore con capacità iniziale e incremento specificati; per incremento 0 la capacità raddoppia quando necessario; -
Vector(int initialCapacity)
crea un vettore con la capacità iniziale specificata; la capacità raddoppia quando necessario; equivale aVector(initialCapacity, 0)
.
Metodi principali
Metodi per esaminare il contenuto
-
boolean contains(Object elem)
restituiscetrue
se l’oggetto specificato è contenuto nel vettore; -
Enumeration elements()
restituisce un oggettoEnumeration
per gli elementi del vettore; -
Object firstElement()
restituisce il primo elemento (all’indice 0) del vettore; -
Object lastElement()
restituisce l’ultimo elemento del vettore; -
Object get(int index)
restituisce l’elemento alla posizione specificata; -
int indexOf(Object elem)
restituisce l’indice della prima occorrenza dell’oggetto specificato, usandoequals()
per la verifica; restituisce -1 se non trova nessuna occorrenza; -
int lastIndexOf(Object elem)
restituisce l’indice dell’ultima occorrenza dell’oggetto specificato, usandoequals()
per la verifica; restituisce -1 se non trova nessuna occorrenza.
Metodi per modificare i contenuti del vettore
-
boolean add(Object o)
aggiunge l’elemento in fondo al vettore; -
void add(int index, Object element)
inserisce l’elemento alla posizione indicata e sposta tutti gli elementi da qui alla fine di una posizione verso destra; -
Object set(int index, Object element)
sostituisce con l’oggetto specificato l’elemento alla posizione indicata; -
Object remove(int index)
rimuove l’elemento alla posizione indicata e sposta tutti gli elementi da qui alla fine di una posizione verso sinistra (e decrementa la dimensione); -
boolean remove(Object o)
rimuove la prima occorrenza dell’oggetto specificato; -
void clear()
rimuove tutti gli elementi dal vettore.
Metodi per gestire la lunghezza del vettore
-
final boolean isEmpty()
controlla se il vettore contiene elementi; -
final int size()
restituisce il numero di elementi; -
final void setSize(int newSize)
stabilisce la dimensione del vettore; se è minore di quella corrente gli elementi in più vengono persi; -
final void trimToSize()
riduce la capacità del vettore alla reale dimensione.
Per trovare il numero di elementi
di un array:
a.length
di un vettore:
v.size()
di una stringa:
s.length()
Conversioni ad array e stringhe
-
Object[] toArray()
restituisce un array che contiene gli elementi del vettore; -
String toString()
restituisce una stringa con la rappresentazione del vettore come concatenazione delle stringhe che rappresentano gli elementi.
Un oggetto della classe Vector
è un vettore di oggetti a dimensione variabile.
Al suo interno usa un array di oggetti (Object[] elementData
) e costruisce un array più grande quando è pieno e si devono aggiungere altri elementi.
La classe Vector
fornisce i metodi per gestire gli elementi (non si può usare l’operatore []
degli array).
Un vettore può contenere elementi non omogenei tra di loro perché contiene oggetti (valori di tipo Object
e tutte le classi sono sottoclassi di Object)
.
Vector vett = new Vector(); Persona p = new Persona(); vett.add(p); Articolo a = new Articolo(); vett.add(a);
Quando si inserisce un elemento in un vettore il riferimento viene convertito in un riferimento Obje
ct; quando si legge un valore si ottiene solo un riferimento Object
; bisogna fare un cast e quindi bisogna sapere di che tipo erano gli elementi.
Persona p = (Persona)vett.get(0); Articolo a = (Articolo)vett.get(1);
Se il cast non è possibile viene lanciata l’eccezione ClassCastException
. Per essere sicuri che il vettore contenga solo elementi di un certo tipo si può controllare il tipo prima dell’inserimento con l’operatore instanceof
.
Dato che numeri, caratteri e valori booleani non sono oggetti non si possono avere vettori di tipi elementari; bisogna usare le classi corrispondenti.
Vector numeri = new Vector(); numeri.add(new Integer(5));
per estrarre il numero:
int n = ((Integer)dati.get(0).intValue());
La classe Vector
ha il metodo elements()
che restituisce un oggetto Enumeration
per iterare sui valori del vettore.
Per esempio per stampare tutti gli elementi di un vettore usando un oggetto Enumeration
si può fare:
Enumeration e = vett.elements(); while (e.hasMoreElements()) { System.out.println(e.nextElement()); }
La classe Vector
ha anche il metodo iterator()
che restituisce un oggetto Iterator
per iterare sui valori del vettore.
Per esempio per stampare tutti gli elementi di un vettore usando un oggetto Iterator
si può fare:
Iterator i = vett.iterator(); while (i.hasNext()) { System.out.println(i.next()); }
Per iterare sugli elementi di un vettore si può usare anche un con ciclo foreach
:
for (Object elemento : vett) { System.out.print(elemento); }
Classe Poligono
che ha come attributo un Vector
di oggetti Punto
.
con Enumeration
:
public void stampaVertici2() { Enumeration enumera = vertici.elements(); while (enumera.hasMoreElements()) { Punto p = (Punto)enumera.nextElement(); System.out.println(p); } }
con Iterator
:
public void stampaVertici3() { Iterator i = vertici.iterator(); while (i.hasNext()) { Punto p = (Punto)i.next(); System.out.println(p); } }
con un foreach
:
public void stampaVertici4() { for (Object o : vertici) { Punto p = (Punto)o; System.out.println(p); } }