Introduo
Uma Estrutura de dados uma construo utilizada para organizar os dados de uma determinada forma.
Um array uma estrutura de dados esttica
java.util
armazenar e manipular dados. A Framework Collections contm:
Uma coleco (collection) um objecto que agrupa vrios objectos. As coleces so utilizadas para
Interfaces so tipos de dados abstractos. As
Interfaces permitem que as coleces sejam manipuladas independentemente dos detalhes das suas representaes; Implementaes So implementaes concretas das coleces. Algoritmos realizam operaes sobre os elementos das coleces. Os algoritmos so polimrficos, ou seja, o mesmo mtodo por ser utilizado em diferentes implementaes de uma interface. Os algoritmos acedem aos elementos dos contentores via iteradores.
Collections.
Ctia Vaz
Coleces
As coleces formam uma hierarquia:
Collection Map
List
Set
Queue
SortedMap
SortedSet
todas as coleces implementam. A plataforma Java no tem nenhuma implementao directa desta interface.
Ctia Vaz
4
Iterador
Com uma coleco de objectos, muitas vezes necessrio percorrer todos os objectos para realizar uma determinada aco em cada objecto. Um iterador permite iterar uma coleco de objectos. Existem duas interfaces na plataforma Java que representam o conceito de iterador de uma coleco: Iterador e ListIterator
Iterator
Iterador
Um objecto do tipo Iterator tem os seguintes mtodos:
hasNext retorna true se a iterao tem mais elementos next retorna o prximo elemento na iterao remove (opcional) remove o ltimo elemento que foi retornado pelo mtodo next.
public interface Iterator<E>{ boolean hasNext(); E next(); void remove();//optional }
Ctia Vaz
Interface Collection
public interface Collection<E> extends Iterable<E> { //Operaes bsicas int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); //opcional boolean remove(Object element); //opcional Iterator<E> iterator(); //Operaes sobre todas as coleces boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); //opcional /* Collection<? extends E> significa que uma coleco de um tipo desconhecido que subtipo de E, isto , uma coleco de qualquer tipo de E;*/ boolean removeAll(Collection<?> c); //opcional /*Collection<?> equivalente a Collection<? extends Object> */ boolean retainAll(Collection<?> c); //opcional void clear(); //opcional //Operaes Array Object[] toArray(); <T> T[] toArray(T[] a); }
Ctia Vaz
Interface Collection
Operaes sobre arrays: Object[] toArray(); <T> T[] toArray(T[] a);
Notas:
As operaes array permitem colocar o contedo de uma coleco num array.
O mtodo toArray() cria um array de tipo Object O mtodo toArray(T[] a) permite ao utilizador fornecer um array ou escolher o tipo em runtime do array de output. Exemplo: Se c for do tipo Collection<String>, ento se pretendermos um array de Strings contendo os elementos da coleco c, podemos fazer String[] a = c.toArray(new String[0]); Ctia Vaz
8
Interface List
A interface List representa uma coleco sequencial.
As listas podem conter elementos duplicados. As implementaes desta interface permitem que o utilizador tenha controlo sobre a posio onde quer inserir, remover ou aceder a elementos. A plataforma Java contm 3 implementaes desta interface: ArrayList, LinkedList e Vector. ArrayList uma implementao desta interface atravs de um array que cresce dinamicamente medida que so inseridos elementos. Uma LinkedList uma lista duplamente ligada. Um Vector uma implementao desta interface atravs de um array que cresce dinamicamente medida que lhe so inseridos elementos. A grande diferena entre ArrayList e Vector que Vector sincronizado e ArrayList no .
Ctia Vaz
9
Interface List
public interface List<E> extends Collection<E> { // Acesso Posicional E get(int index); E set(int index, E element); //opcional boolean add(E element); //opcional void add(int index, E element); //opcional E remove(int index); //opcional boolean addAll(int index, Collection<? extends E> c); //opcional // Procura int indexOf(Object o); int lastIndexOf(Object o); // Iterao ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); //Range-view List<E> subList(int from, int to); }
Ctia Vaz
10
Interface List
Notas:
No caso das operaes que so opcionais, se no forem suportadas pela implementao, lanam uma excepo do tipo UnsupportedOperationException; No caso de operaes que envolvam indexao (ex: E get(int index)), se 0>ndice ou se ndice>=size(), estas lanam uma excepo do tipo IndexOutOfBoundsException
Ctia Vaz
11
Interface ListIterator
A Interface List tem dois mtodos que retornam um objecto do tipo ListIterator
ListIterator<E> listIterator() : retorna um ListIterator posicionado no incio da lista ListIterator<E> listIterator(int index) : retorna um ListIterator posicionado no ndice especificado.
O ndice refere-se ao elemento que deveria ser retornado por uma invocao inicial ao mtodo next.
Uma invocao inicial ao mtodo previous deveria retornar o elemento cujo ndice fosse index-1 public interface ListIterator<E> extends Iterator<E> { boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); //optional void set(E e); //optional void add(E e); //optional }
Ctia Vaz
12
Interface ListIterator
Numa lista de n elementos, existem n+1 valores vlidos para o ndice (0 a n)
o iterador est sempre entre dois elementos,o que deve ser retornado por uma invocao ao mtodo previous e o que deve ser retornado por uma invocao ao mtodo next. A primeira invocao ao mtodo previous (next), aps uma sequncia de invocaes ao mtodo next (previous), retorna o mesmo elemento do que a ltima invocao ao mtodo next (previous);
Elemento(0) Elemento(1) Elemento(2) Elemento(3)
Index:
3 Ctia Vaz
13
Interface ListIterator
Mtodos:
nextIndex retorna o ndice do elemento que deveria ser retornado por uma subsequente invocao ao mtodo next. previousIndex retorna o ndice do elemento que deveria ser retornado por uma subsequente invocao ao mtodo previous. remove remove o ltimo elemento set substitui o ltimo elemento retornado pelo mtodo next ou pelo mtodo previous pelo elemento especificado. add insere um novo elemento na lista na posio anterior posio actual do iterador
Ctia Vaz
14
Vectores
No momento em que o array criado, o seu comprimento fixo.
Por vezes um array torna-se demasiado pequeno para a sua utilizao. Por vezes um array torna-se demasiado grande para a sua utilizao, mas a parte no utilizada do array no est disponvel para outras coisas. Os Vectores servem os mesmos propsitos que os arrays, mas o seu tamanho pode ser alterado durante a execuo do programa.
Ctia Vaz
15
Vectores
Os Vectores permitem mais flexibilidade mas:
so menos eficientes que os arrays; o tipo base de um vector tem de ser uma classe;
Para criar um vector tem que se importar a definio da classe Vector do package java.util
Ctia Vaz
16
Vectores
Sintaxe de declarao e criao de um vector.
Vector<Base_Type> v1 = new Vector<Base_Type>(); Vector<Base_Type> v2 = new Vector<Base_Type>(Initial_Capacity); Vector<Base_Type> v2 = new Vector<Base_Type>(Initial_Capacity, Capacity_Increment);
Ctia Vaz
17
Vectores-Construtores
public Vector<tipo_da_base>(int cap_inicial) /*Cria um vector vazio com o tipo base especificado e com a capacidade inicial tambm especificada. Quando necessrio aumentar a sua capacidade, este aumenta para o dobro.*/ public Vector<tipo_da_base>( ) /*Cria um vector vazio com o tipo base especificado e capacidade inicial de 10. Quando necessrio aumentar a sua capacidade, este aumenta para o dobro.*/ public Vector<tipo_da_base>(int cap_inicial,int cap_incremento) /*Cria um vector vazio com o tipo base, a capacidade inicial e a capacidade de incremento especificada.*/ Ctia Vaz
18
Vectores-Mtodos
A classe Vector implementa a interface List, portanto tem como mtodos
E get(int index); E set(int index, E element); boolean add(E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection<? extends E> c); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); List<E> subList(int from, int to);
Ctia Vaz
19
Vectores-Mtodos
E tambm
int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); Object[] toArray(); <T> T[] toArray(T[] a); Ctia Vaz
20
Vectores-Mtodos
E tambm contm os mtodos public void setElementAt(tipo_da_base elemento, int index) /*Coloca na posio dada pelo index o novo elemento. (0<=index<size(), se no lana uma excepo do tipo ArrayIndexOutOfBoundsException) */ public tipo_da_base elementAt(int index) /*Retorna o elemento que se encontra na posio index. (0<=index<size(), se no lana uma excepo do tipo ArrayIndexOutOfBoundsException) */ public void addElement(tipo_da_base elemento) /*Adiciona o elemento especifico no final do vector e incrementa(mais uma posio) o tamanho (size()) do vector e, se necessrio, a capacidade*/ Ctia Vaz
21
Vectores-Mtodos
public void insertElementAt(tipo_da_base elemento, int index) /*Insere o elemento especfico na posio index (0<=index<=size(), se no lana uma excepo do tipo ArrayIndexOutOfBoundsException) */ public void removeElementAt(int index) /*Elimina o elemento que se encontra na posio especificada pelo index. (0<=index<=size(), se no lana uma excepo do tipo ArrayIndexOutOfBoundsException) */ public boolean removeElement(Object elemento) /* Elimina a primeira ocorrencia do elemento especificado no vector, caso este ocorra. Retorna true, caso ocorra, seno retorna false. */ Ctia Vaz
22
Vectores-Mtodos
public void removeAllElements( ) /*Remove todos os elementos do vector.*/ public int indexOf(Object elemento) /*Retorna o index do primeiro elemento que igual ao elemento passado como parmetro. Caso no exista, retorna -1 */ public int indexOf(Object elemento, int inicio) /* Retorna o index do primeiro elemento que igual ao elemento passado como parmetro, considerando apenas indices maiores ou iguais a inicio. Caso no exista, retorna -1 */ public int lastIndexOf(Object elemento) /* Retorna o index do ltimo elemento que igual ao elemento passado como parmetro. Caso no exista, retorna -1 */
Ctia Vaz
23
Vectores-Mtodos
public tipo_da_base firstElement( ) /*Retorna o primeiro elemento do vector. Caso esteja vazio lanada uma excepo do tipo NoSuchElementException*/ public tipo_da_base lastElement( ) /*Retorna o ltimo elemento do vector. Caso esteja vazio lanada uma excepo do tipo NoSuchElementException*/ public boolean isEmpty( ) /*Retorna true se o vector estiver vazio, caso contrrio retorna false*/ public int size( ) /*Retorna o nmero de elementos do vector*/
Ctia Vaz
24
Vectores-Mtodos
public int capacity( ) /*Retorna a capacidade actual do vector*/ public void ensureCapacity(int n) /*Incrementa a capacidade do vector de forma a assegurar que o vector tem capacidade para mais n elementos*/ public void trimToSize( ) /*Diminui a capacidade do vector de forma a ficar igual ao tamanho do vector.*/
Ctia Vaz
25
Vectores-Mtodos
public void setSize(int n) /*Altera o tamanho (size()) do vector. Se n>=size(), os novos elementos recebem o valor null; caso contrrio, se n >=0 os elementos entre n e size so discartados. Se n<0, lanada uma excepo do tipo ArrayIndexOutOfBoundsException */ public Object clone( ) /*Retorna um clone do vector, isto , uma cpia independente do vector.*/ public boolean equals(Object o ) /*Retorna true se o for um vector, se ambos tm o mesmo tamanho e se contm a mesma lista de elementos pela mesma ordem; caso contrrio retorna false.*/
Ctia Vaz
26
Mtodo Clone
Mtodos de acesso devem retornar uma cpia do vector no o prprio vector de instncia privado. Para tal, pode-se utilizar o mtodo clone.
Exemplo public Vector<String> getVector(){ return (Vector<String>)v.clone(); }
Ctia Vaz
27
Lista Ligada
Uma lista ligada uma coleco de objectos, designados por ns, em que cada um contem dados e uma referncia para outro n, de modo a formarem uma lista. O primeiro n designado por
head node.
Uma lista ligada diz-se simplesmente ligada quando cada n contm uma referncia (next) para o prximo n. Uma lista diz-se duplamente ligada quando cada n contm duas referncias (next e previous) para o prximo n e para o n anterior.
Ctia Vaz
28
Lista Ligada
Exemplo de uma lista duplamente ligada:
29
poo.util
30
poo.util.Collection
public interface Collection extends Iterable { // Operaes bsicas public int size(); public boolean isEmpty(); public boolean contains(Object obj); public boolean add(Object element); //opcional public boolean remove(Object obj); //opcional public Iterator iterator(); // Operaes sobre toda a coleces public boolean containsAll(Collection c); public boolean addAll(Collection c); //opcional public boolean removeAll(Collection c); //opcional public boolean retainAll(Collection c); //opcional public void clear(); //opcional // Array operations public Object[] toArray(); }
31
poo.util.Iterable e poo.util.Iterator
public interface Iterator { // Verifica se existe prximo elemento boolean hasNext(); // Retorna o elemento da posio corrente e // avana para a prxima posio Object next(); // Remove da coleco o elemento retornado pelo ltimo next void remove(); } public interface Iterable { Iterator iterator(); }
32
poo.util.AbstractCollection
public abstract class AbstractCollection implements Collection { public boolean isEmpty() {return size() == 0;} // Os dois MTODOS seguintes so opcionais // Se o add no for redefinido lana UnsupportedOperationException public boolean add( Object element ) // opcional { throw new UnsupportedOperationException();} public boolean remove(Object element) { // opcional Iterator i = iterator(); if (element==null) { while ( i.hasNext() ) if ( i.next() == null ){ i.remove(); //remove de iterator opcional, pode lanar excepo return true; } // caso o iterador no suporte o remove } else // Remover o primeiro elemento com valor igual while ( i.hasNext() ) { if ( element.equals( i.next()) ){ i.remove(); return true;} } return false;} 33
poo.util.AbstractCollection
public boolean contains( Object elem ) { Iterator i = iterator(); if ( elem == null ) { while ( i.hasNext() ) if ( i.next() == null ) return true; } else while ( i.hasNext() ) if ( elem.equals( i.next() ) ) return true; return false;} public Object[] toArray() { Object[] result = new Object[ size() ]; Iterator ie = iterator(); int ia = 0; while( ie.hasNext() ) result[ia++] = ie.next(); return result; }
34
poo.util.AbstractCollection
public void clear( ) { // opcional Iterator e = iterator(); while (e.hasNext()) { e.next(); e.remove(); } } public String toString() { if ( isEmpty() ) return "[ ]"; String separator = "[ "; String comma = ", "; StringBuffer sb = new StringBuffer(); Iterator i= iterator(); while ( i.hasNext() ) { sb.append(separator); sb.append(i.next()); separator= comma; } sb.append(']'); return sb.toString(); } 35
poo.util.AbstractCollection
public boolean equals( Object o ) { if (obj == this) return true; if ( !(obj instanceof Collection ) ) return false; Collection c = (Collection) obj; if ( size() != l.size()) return false; Iterator i = iterator(), j = c.iterator(); while ( i.hasNext() ) { Object e1 = i.next(); Object e2 = j.next(); if ( e1 == null ? e2 != null : !e1.equals(e2) ) return false; } return true;}
36
poo.util.ArrayCollection
public class ArrayCollection extends AbstractCollection { protected Object[] array; private int size = 0; public ArrayCollection(int cap) { array = new Object[cap]; size=0; } public ArrayCollection() { this(10); } public int size() { return size; } public int capacity(){ return array.length; } private void addElementAt(int ind, Object o) { ensureCapacity( size + 1 ); shiftRight(ind); array[ind] = o; ++size;} private void remElementAt(int ind){shiftLeft(ind); array[--size]=null;} private void shiftRight(int ind){ System.arraycopy(array, ind, array, ind+1, size()-ind);} private void shiftLeft(int ind) { System.arraycopy(array, ind+1, array, ind, size()-ind-1);}
37
poo.util.ArrayCollection
private void ensureCapacity( int minCapacity ) { int oldCapacity = array.length; if (minCapacity > oldCapacity) { Object[] oldData = array; int newCapacity = oldCapacity * 2; if (newCapacity < minCapacity)newCapacity = minCapacity; array = new Object[newCapacity]; System.arraycopy( oldData, 0, array, 0, size ); }} public boolean remove(Object obj) { if ( obj == null ) { for (int i = 0; i < size ; ++i ) if ( array[i] == null ) {remElementAt(i); return true; } } else for (int i = 0; i < size ; ++i ) if( obj.equals( array[i] ) ) {remElementAt(i); return true;} } return false;} public boolean add( Object element) { addElementAt( element, size ); return true;} 38
poo.util.ArrayCollection
Mtodos redefinidos por terem implementaes mais eficientes
public Object[] toArray() {...} public boolean addAll(Collection c) {...} //...
39
40
poo.util.LinkedCollection
public class LinkedCollection extends AbstractCollection { // N interno da lista simplesmente ligada protected static class Node { private Object data = null; // Referencia para os dados private Node next = null; // Referencia para o n seguinte private Node(Object e, Node n) { data = e; next = n; } private Node() { } } // VARIAVEIS DE INSTNCIA // Inicialmente criado um n dummy para facilitar as operaes de // adio e remoo. No tm que ser testadas as inseres // e remoes cabea. protected Node head = new Node(); // Nmero de elementos adicionados e no removidos private int size = 0; // Retorna o nmero de elementos adicionados e no removido public int size() { return size; } 42
poo.util.LinkedCollection
private Node addNode(Node prev, Object obj){ Node next = prev.next; Node novo = new Node(obj, next); prev.next = novo; ++size; return novo;} public boolean add(Object obj) { addNode(head, obj); return true; } public Iterator iterator(){ return new LinkedIterator(); }
43
poo.util.LinkedCollection
private void removeNode(Node prev, Node rem) { prev.next = rem.next; // Desliga o n rem.next = null; rem.data = null; --size;} private boolean remove(Object obj) { Node prev= head, aux = head.next; if ( obj == null ) // Remover o primeiro elemento a null while ( aux != null ) { if (aux.data == null ) { removeNode(prev, aux); return true; } prev = aux; aux = aux.next; } else // Remover o primeiro elemento com valor igual while ( aux != null ) { if (obj.equals( aux.data )) { { removeNode(prev, aux); return true; } prev = aux; aux = aux.next; } return false;
44
poo.util.LinkedIterator
private class LinkedIterator implements Iterator { // N dos dados retornados pelo next() anterior. private Node node = head; private Node prev = null; public boolean hasNext() { return node.next != null; } public Object next() { if ( node.next == null ) throw new NoSuchElementException(); prev = node; node = node.next; // Avana para o corrente return node.data; // Retorna o elemento da posio corrente. } public void remove() { // Se a ltima operao no foi next() lana excepo if ( prev == null ) throw new IllegalStateException(); removeNode(prev, node); // Remove o n node = prev; // Se o n foi removido actualiza o n com anterior prev = null; // Assinala que a operao anterior no foi um next() } } 45
poo.util
46