Anda di halaman 1dari 46

Estruturas de Dados Dinmicas e Genricos em Java

Adaptado dos slides do livro:


Java, an Introduction to Problem Solving and Programming, 4d Walter Savitch
Ctia Vaz

Introduo
Uma Estrutura de dados uma construo utilizada para organizar os dados de uma determinada forma.
Um array uma estrutura de dados esttica

As estruturas de dados dinmicas podem aumentar ou diminuir durante a execuo de um programa.


Exemplo: vectores e listas ligadas.
Ctia Vaz

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.

java.util o package que contm a Framework

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

A interface Collection o menor denominador comum que

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

ListIterator Ctia Vaz


5

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:

As instncias da classe LinkedList, do package java.util so listas Ligadas


Ctia Vaz

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) {...} //...

/*Implementao do mtodo iterator*/ public Iterator iterator(){ return new ArrayIterator(); }

39

Classe Interna: ArrayIterator


private class ArrayIterator implements Iterator { private int index = 0; // Posio do elemento retornado pelo proximo next() private int lastNext = -1; public boolean hasNext() { return index < size; } public Object next() { if ( index >= size ) throw new NoSuchElementException(); lastNext = index++; // Indice do ltimo next() return array[lastNext]; } public void remove() { // Se no tiver existido anteriormente um next() lana excepao if ( lastNext == -1 ) throw new IllegalStateException(); // Remove o elemento retornado pelo ltimo next() remElementAt(lastNext); index = lastNext; lastNext = -1;} }

40

Classe Interna (Inner Class)


Uma classe interna uma classe definida dentro da definio de outra classe. Uma classe interna providencia a soluo para o problema da perca de privacidade. Os mtodos das classes internas e a externa (outer) tm acesso a cada um dos outros mtodos e variveis de instncia, mesmo quando declarados private.
public class OuterClass { OuterClass_Instance_Variables OuterClass_Methods private class InnerClass { InnerClass_Instance_Variables InnerClass_Methods } }
41

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

Anda mungkin juga menyukai