edutecnica

Array dinamici

         

Abbiamo visto come la dichiarazione di un vettore in Java venga effettuato tramite una dichiarazione del tipo:
int A[] = new int[5];
questo significa che il vettore in questione potrà avere dimensione massima di 5 elementi. In fase di esecuzione non è possibile cambiare questa impostazione. Per avere un vettore dalla dimensione modificabile in fase di esecuzione, bisogna ricorrere a due classi del package java.util: la classe Vector e la classe ArrayList.


La classe Vector

         

E' possibile accedere solo agli elementi compresi fra l'indice 0 e size()-1. La differenza di spazio fra capacity e size è disponibile per l'inserimento di nuovi elementi (add) questo spazio disponibile può essere annullato tramite l'operazione trimToSize() (recuperando memoria) se invece serve, aumentare le dimensioni del vettore si può usare una chiamata ensureCapacity(0) che raddoppia la la dimensione della capacità del vettore; ma questa operazione avviene automaticamente.

Qui un esempio con un oggetto Vector:

import java.util.Vector;
class Vect{
public static void main (String args []){
     Vector T=new Vector(2);
     vista(T);
     T.addElement("uno");vista(T);
     T.addElement("due");vista(T);
     T.addElement("tre");vista(T);
     T.trimToSize();vista(T);
     T.insertElementAt("ins",1);vista(T);
     T.setElementAt("mod",1);vista(T);
     T.set(1,"mod2");vista(T);
     T.removeElementAt(1);vista(T);
}//fine main
static void vista(Vector T){
     for(int i=0;i < T.size();i++)System.out.print(T.elementAt(i)+" ");
     System.out.println("\nsize:"+T.size()+" capacity:"+T.capacity());
}//fine metodo vista
}//fine class Vect

Produce il seguente output:

size:0 capacity:2
uno
size:1 capacity:2
uno due
size:2 capacity:2
uno due tre
size:3 capacity:4
uno due tre
size:3 capacity:3
uno ins due tre
size:4 capacity:6
uno mod due tre
size:4 capacity:6
uno mod2 due tre
size:4 capacity:6
uno due tre
size:3 capacity:6

Noi abbiamo impostato la capacità iniziale a 2 elementi; da notare come trimToSize() taglia la capacità alla dimensione dell'ultimo elemento inserito e come la capacità si auto incrementa all'inserimento di un nuovo elemento se viene superata la capacità attuale.

tipo metodo operazione
void insertElementAt(Object x,int i) inserisce x all'indice i
void addElement(Object x) attacca x in fondo
void clear() elimina tutti gli elementi
boolean contains(Object x) se contiene x
void ensureCapacity(int cap) aumenta lo spazio di capacità
Object elementAt(int i) elemento di indice i
Object firstElement() il primo elemento
Object lastElement() l'ultimo elemento
int indexOf(Object x) il primo indice dell'elemento x, -1 se non esiste
boolean isEmpty() size()==0
int lastIndexOf(Object x) l'ultimo indice dell'elemento x, -1 se non esiste
Object removeElementAt(int i) rimuove l'i-esimo elemento
void setElementAt(Object x, int i) mette x all'indice i
void setSize(int nuovaDimensione) aumenta la dimensione
int size() numero di elementi
Object[] toArray() converte Vector in Array
void trimToSize() tosa il vettore alla dimensione dell'ultimo elemento inserito

La classe ArrayList

         

E' una versione migliorata della classe Vector, viene data meno importanza al concetto di capacity.

Qui un esempio con un'istanza dellla classe ArrayList:

import java.util.ArrayList;
class Array{
public static void main (String args []){
ArrayList A=new ArrayList(2);
vista(A);
A.add("uno");vista(A);
A.add("due");vista(A);
A.add("tre");vista(A);
A.trimToSize();vista(A);
A.add(1,"inserito");vista(A);
A.set(1,"modificato");vista(A);
A.remove(1);vista(A);
}//fine main
static void vista(ArrayList A){
for(int i=0;i < A.size();i++)System.out.print(A.get(i)+" ");
System.out.println("\nsize:"+A.size());
}//fine metodo vista
}//fine class Array

Produce il seguente output:

size:0
uno
size:1
uno due
size:2 uno due tre
size:3 uno due tre
size:3
uno inserito due tre
size:4
uno modificato due tre
size:4
uno due tre
size:3

L'elenco dei metodi della classe ArrayList è la seguente:

tipo metodo operazione
void add(int i, Object x) inserisce x all'indice i
boolean add(Object x) attacca x in fondo
void clear() elimina tutti gli elementi
Object get(int i) restituisce l'elemento all'indice i
int indexOf(Object x) il primo indice dell'elemento x, -1 se x non esiste
boolean isEmpty() size()==0 ?
int lastIndexOf(Object x) restituisce l'ultimo indice dell'elemento x, -1 se x non esiste
Object remove(int i) cancella l'i-esimo elemento
Object set(int i, Object x) mette x all'indice i
int size() numero di elementi
Object[] toArray() converte ArrayList in Array
void trimToSize() tosa il vettore alla dimensione dell'ultimo elemento inserito

La classe LinkedList

         

Una LinkedList può essere assimilata ad una coda doppia, cioè una struttura sequenziale in cui è possibile inserire ed estrarre i dati da entrambi i lati.

L'elenco dei principali metodi della classe LinkedList è la seguente:

tipo metodo operazione
void clear() Svuota la lista.
boolean contains(Object x) Verifica se la lista contiene l'oggetto specificato, usando il metodo standard equals (l'oggetto può occorrere più volte).
boolean add(int i, Object x) inserisce x all'indice i
boolean add(Object x) Inserisce un oggetto in fondo alla lista
boolean remove(Object x) Cancella la prima occorrenza dell'oggetto a partire dall'inizio della lista, che rimane inalterata se non contiene l'oggetto. Il metodo standard equals viene impiegato per trovare la prima occorrenza

Altri metodi utilizzabili sono riportati negli esempi seguenti:

//creazione di una lista e inserimento di oggetti nella stessa
import java.util.LinkedList; public class ll1 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
T.add("quattro");
System.out.println(T);
System.out.println("Size: "+T.size());
System.out.println("vuota? "+T.isEmpty());
System.out.println("Contiene 'tre'? "+T.contains("tre"));
}
}

//duplicazione di un'istanza di oggetto linkedlist tramite
//l'uso della funzione clone()


import java.util.LinkedList;
public class ll2 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("primo");
T.add("secondo");
T.add("terzo");
T.add("quarto");
System.out.println("lista attuale:"+T);
LinkedList copy = (LinkedList) T.clone();
System.out.println("lista clonata:"+copy);
}
}

//lettura del primo elemento di una linkedlist
import java.util.LinkedList;
public class ll3 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
System.out.println("primo elemento: "+T.element());
System.out.println("primo elemento: "+T.getFirst());
System.out.println("primo elemento: "+T.peek());
System.out.println("primo elemento: "+T.peekFirst());
}
}

//lettura dell'ultimo elemento di una linkedlist
import java.util.LinkedList;
public class ll4 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
System.out.println("ultimo elemento: "+T.getLast());
System.out.println("ultimo elemento: "+T.peekLast());
}
}

//inserimento di un elemento in testa alla lista
import java.util.LinkedList;
public class ll5 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
System.out.println(T);
System.out.println("inserimento in testa");
T.addFirst("primo");
System.out.println(T);
System.out.println("inserimento in testa");
T.offerFirst("primo2");
System.out.println(T);
}
}

//inserimento di un elemento in coda alla linkedlist

import java.util.LinkedList; public class ll6 {
public static void main(String a[]){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
System.out.println(T);
System.out.println("inserimento in coda");
T.addLast("ultimo");
System.out.println(T);
System.out.println("inserimento in coda");
T.offerLast("ultimo1");
System.out.println(T);
System.out.println("inserimento in coda ");
T.offer("ultimo2");
System.out.println(T);
}
}

//vari metodi per la rimozione di elementi da una linkedlist

import java.util.LinkedList;
public class ll7 {
public static void main(String[] args){
LinkedList T = new LinkedList();
T.add("uno");
T.add("due");
T.add("tre");
T.add("quattro");
T.add("cinque");
T.add("sei");
T.add("sette");
System.out.println(T);
System.out.println("chiamata remove():"+T.remove());
System.out.println("dopo remove():");
System.out.println(T);
System.out.println("chiamata remove(index):"+T.remove(2));
System.out.println("dopo remove(index):"); System.out.println(T);
System.out.println("chiamata remove(object):"+T.remove("tre"));
System.out.println("dopo remove(object):"); System.out.println(T);
System.out.println("chiamata removeFirst():"+T.removeFirst());
System.out.println("dopo removeFirst():"); System.out.println(T);
System.out.println("chiamata removeLast():"+T.removeLast());
System.out.println("dopo removeLast():"); System.out.println(T);
}
}