Colecções

Propaganda
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
A biblioteca Collection em java.util
• Arquitectura unificada para estruturas de dados
mais comuns
–
–
–
–
listas, pilhas, filas, conjuntos, tabelas
Interfaces para descrever funcionalidade
Implementações “de uso geral”
Algoritmos típicos para cada estrutura
• genéricos (polimórficos)
• Aparece no jdk 1.2
– organiza e sistematiza estruturas de dados já oferecidas
nas API anteriores, ex. Vector, Hashtable.
Collection - 1
Colecções
• Agrupam objectos designados elementos
• Nas interfaces estão previstas variantes
– ex: estrutura pode ser não mutável, ou de tamanho fixo
– alguns métodos designados opcionais
– prevista excepção UnsupportedOperationException para
operações que não tenham significado na variante
• Normalização das estruturas
– Dispensa a programação de estruturas usuais
– Permite desenvolver programas independentes da implementação
das estruturas
– Facilita a interoperabilidade entre API’s
• normaliza a forma de tratar colecções de objectos
– Facilita o desenvolvimento de novas API’s
– Favorece reutilização de software
Collection - 2
Cristina Ribeiro
Collection-1
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Collection, List, Set, Map
• Collection
– usada para transferir genericamente colecções de elementos
– não é fornecida implementação de referência
• Set
– Collection que não tem duplicados
– representação para a abstracção matemática “conjunto”
– implementações: AbstractSet, HashSet, TreeSet
• List
– Collection que tem ordem; admite duplicados
– acesso indexado
– implementações: AbstractList, LinkedList, ArrayList
• Map
– Mapeamento de chaves em valores
– Chaves únicas, cada chave mapeia em 1 valor no máximo
– Implementações: AbstractMap, HashMap, TreeMap
Collection - 3
Iteração sobre estruturas
• Solução directa: ciclo controlado por variável
for( int i = 0; i < v.length; i ++)
{...}
• Problema: requer conhecer a estrutura da colecção
• Alternativa: abstrair operações
for( itr = v.first(); itr.isValid();
itr.advance())
{...}
Collection - 4
Cristina Ribeiro
Collection-2
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Estrutura com iterador-1
public class MyContainer
{
Object [ ] items;
int size;
public Object get( int idx ) {...}
public boolean add( Object x ) {...}
public MyContainerIterator iterator( )
{ return new MyContainerIterator(this);}
}
public class MyContainerIterator
{
private int current = 0;
private MyContainer container;
MyContainerIterator(MyContainer c)
{container = c;}
public boolean hasNext( )
{return current < container.size;}
public Object next( )
{ return container.items[ current++ ];}
}
Collection - 5
Estrutura com iterador-2
public class MyContainer
{
private Object [ ] items = new Object[ 5 ];
private int size = 0;
public Iterator iterator( )
{ return new MyContainerIterator(this); … }
public interface Iterator
{ boolean hasNext();
Object next(); }
class MyContainerIterator implements Iterator
{
private int current = 0;
private MyContainer container;
MyContainerIterator(MyContainer c)
{container = c;}
public boolean hasNext( )
{return current < container.size;}
public Object next( )
{ return container.items[ current++ ];}
}
Collection - 6
Cristina Ribeiro
Collection-3
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Estrutura com iterador-3
package weiss.ds;
public class MyContainer
{
private Object [ ] items = new Object[ 5 ];
private int size = 0;
// ...
public Iterator iterator( )
{ return new LocalIterator(this);}
private static class LocalIterator implements Iterator
{
private int current = 0;
private MyContainer container;
private LocalIterator( MyContainer c)
{container = c;}
public boolean hasNext( )
{return current < container.size;}
public Object next( )
{ return container.items[ current++ ];}
}}
Collection - 7
Estrutura com iterador-4
package weiss.ds;
public class MyContainer
{
private Object [ ] items = new Object[ 5 ];
private int size = 0;
public Object get( int idx ) {...}
public boolean add( Object x ) {...}
public Iterator iterator( )
{ return new LocalIterator( );}
private class LocalIterator implements Iterator
{
private int current = 0;
public boolean hasNext( )
{return current < size;}
public Object next( )
{ return items[ current++ ];}
}
}
Collection - 8
Cristina Ribeiro
Collection-4
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Iteradores
•
Solução 1
–
–
–
–
•
Classes públicas para iterador e contentor
Referência do iterador no contentor
Iterador partilha dados do contentor
Utilizador do contentor tem de definir iterador adequado
Solução 2
– Contentor devolve iterador genérico, programador usa interface Iterator
– iterator() é fábrica que produz iterador cujo tipo fica escondido do
utilizador
•
Solução 3
– Classe do iterador é nested class no contentor
– Evita partilha de dados no package
– Iterador é objecto independente construído com referência ao contentor
•
Solução 4
– Classe do iterador é inner class do contentor
– Iterador está implicitamente associado ao contentor, e refere directamente os
seus membros
Collection - 9
Hierarquia para listas em Collection
Collection
Iterator
AbstractCollection
List
ListIterator
AbstractList
AbstractSequentialList
LinkedList
ArrayList
Vector
Stack
Collection - 10
Cristina Ribeiro
Collection-5
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
A interface Enumeration
• public interface Enumeration
– Objectos que a implementam geram séries de
elementos, um de cada vez
• Exemplo: imprimir elementos de um vector v
for (Enumeration e = v.elements(); e.hasMoreElements() ;)
{ System.out.println(e.nextElement());
}
• Métodos
• boolean hasMoreElements()
–
Tests if this enumeration contains more elements.
• Object nextElement()
– Returns the next element of this enumeration if this
enumeration object has at least one more element to provide.
Collection - 11
A interface Iterator
• public interface Iterator
– Substitui Enumeration na biblioteca Collection
– Permite remover objectos da Collection
• Métodos
• boolean hasNext()
–
Returns true if the iteration has more elements.
• Object next()
– Returns the next element of the iteration.
• void remove()
– Removes from the underlying collection the last element
returned by the iterator (optional operation).
Collection - 12
Cristina Ribeiro
Collection-6
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
A interface Collection
• Construtores nas classes que a implementam
– construtor sem argumentos
– construtor com argumento que é uma colecção
• Métodos obrigatórios:
boolean add(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
Iterator iterator()
boolean
remove(Object o)
int size()
Object[] toArray()
Collection - 13
A interface Collection
• Genérica
– A biblioteca só fornece implementações para as suas
subinterfaces (ex: List, Map, Set)
boolean add(Object o)
boolean isEmpty()
boolean addAll(Collection c)
Iterator iterator()
void clear()
boolean
remove(Object o)
boolean contains(Object o)
boolean
removeAll(Collection c)
boolean
boolean retainAll(Collection c)
containsAll(Collection c)
boolean equals(Object o)
int size()
int
Object[] toArray()
hashCode()
Object[] toArray(Object[] a)
Collection - 14
Cristina Ribeiro
Collection-7
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Iterador para Collection
public interface Iterator {
boolean hasNext();
Object next();
void remove();
// Optional
}
hasNext()
e
• remove()
next()
usados para controlar ciclos
só pode ser chamado uma vez por cada
next()
• Exemplo: filtro sobre uma colecção:
static void filter(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); )
if (!cond(i.next()))
i.remove(); }
Collection - 15
Comparação
• Estão disponíveis 2 interfaces para normalizar as
comparações
• Comparable: “ordem natural” de uma classe
– impõe ordem total nos elementos de uma classe
– quem implementa: Character, File, Long,
ObjectStreamField, Short, String, Float, Integer, Byte,
Double, BigInteger, BigDecimal, Date, CollationKey
• Comparator: fornece função de comparação
– constrói-se “objecto funcional” que sabe comparar
• pode ser passado a métodos (ex: ordenação)
• permite usar ordenações diversas sobre objectos do mesmo
tipo
Collection - 16
Cristina Ribeiro
Collection-8
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
A interface Comparable
em java.lang
• Impõe uma ordem total nos objectos das classes
que a implementam
– Ordem natural da classe
public int compareTo(Object o)
Compares this object with the specified object for
order. Returns a negative integer, zero, or a positive
integer as this object is less than, equal to, or
greater than the specified object.
The implementor must ensure sgn(x.compareTo(y)) == sgn(y.compareTo(x)) for all x and y.
The implementor must also ensure that the relation is
transitive: (x.compareTo(y)>0 &&
y.compareTo(z)>0) implies x.compareTo(z)>0.
Collection - 17
Interface Comparator
package weiss.util;
import java.io.Serializable;
/**
* Comparator function object interface.
*/
public interface Comparator extends Serializable
{
/**
* Return the result of comparing lhs and rhs.
* @param lhs first object.
* @param rhs second object.
* @return < 0 if lhs is less than rhs,
*
0 if lhs is equal to rhs,
*
> 0 if lhs is greater than rhs.
* @throws ClassCastException if objects cannot be compared.
*/
int compare( Object lhs, Object rhs ) throws
ClassCastException;
}
Collection - 18
Cristina Ribeiro
Collection-9
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Classe Collections em java.util
• Apenas métodos estáticos que operam em ou
retornam colecções
– Variáveis
static List EMPTY_LIST
static Map EMPTY_MAP
static Set EMPTY_SET
– Métodos
• cópia
• ordenações
static void sort(List list)
Sorts the specified list into ascending order, according to
the natural ordering of its elements.
static void sort(List list, Comparator c)
Sorts the specified list according to the order induced by
the specified comparator.
• mínimo, máximo
Collection - 19
A classe Collections
• Métodos de classe para trabalhar com colecções
static
static
static
static
int binarySearch(List list, Object key)
void copy(List dest, List src)
Object max(Collection coll)
Object max(Collection coll, Comparator comp)
static Comparator reverseOrder()
• Algoritmos polimórficos
static
static
static
static
void shuffle(List list)
Set singleton(Object o)
Collection unmodifiableCollection(Collection c)
Map unmodifiableMap(Map m)
Collection - 20
Cristina Ribeiro
Collection-10
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Classe Collections
em weiss.util
package weiss.util;
/**
* Instanceless class contains static methods that operate on
collections.
*/
public class Collections
{
private Collections( ){}
/*
* Returns a comparator that imposes the reverse of the
* default ordering on a collection of objects that
* implement the Comparable interface.
* @return the comparator.
*/
public static Comparator reverseOrder( )
{
return new ReverseComparator( );
}
static final Comparator DEFAULT_COMPARATOR = new
DefaultComparator( );
(…)
Collection - 21
Classe Collections
em weiss.util
private static class ReverseComparator implements Comparator
{
public int compare( Object lhs, Object rhs )
{
return -( (Comparable) lhs ).compareTo( rhs );
}
}
static class DefaultComparator implements Comparator
{
public int compare( Object lhs, Object rhs )
{
return ( (Comparable) lhs ).compareTo( rhs );
}
}
(…)
Collection - 22
Cristina Ribeiro
Collection-11
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Classe Collections
em weiss.util
public static Object max( Collection coll )
{
return max( coll, DEFAULT_COMPARATOR );
}
public static Object max( Collection coll, Comparator cmp )
{
if( coll.size( ) == 0 )
throw new NoSuchElementException( );
Iterator itr = coll.iterator( );
Object maxValue = itr.next( );
while( itr.hasNext( ) )
{
Object current = itr.next( );
if( cmp.compare( current, maxValue ) > 0 )
maxValue = current;
}
return maxValue;
}
}
Collection - 23
Interface de List
public interface List extends Collection {
// Positional Access
Object get(int index);
Object set(int index, Object element);
// Optional
void add(int index, Object element);
// Optional
Object remove(int index);
// Optional
abstract boolean addAll(int index, Collection c);// Optional
// Search
int indexOf(Object o);
int lastIndexOf(Object o);
// Iteration
ListIterator listIterator();
ListIterator listIterator(int index);
// Range-view
List subList(int from, int to);
}
Collection - 24
Cristina Ribeiro
Collection-12
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Iterador de List
public interface ListIterator extends Iterator {
boolean hasNext();
Object next();
boolean hasPrevious();
Object previous();
int nextIndex();
int previousIndex();
void remove();
void set(Object o);
void add(Object o);
// Optional
// Optional
// Optional
}
… usando para iterar para trás numa lista:
for (ListIterator i=l.listIterator(l.size()); i.hasPrevious(); ) {
Foo f = (Foo) i.previous();
…
}
Collection - 25
Interface de List
em weiss.util
package weiss.util;
/**
* List interface.
* The version in java.util places the
* union of sensible LinkedList and ArrayList methods in
* this interface. We place the useful intersection here
* instead, which is arguably empty.
*/
public interface List extends Collection
{
/**
* Returns the item at position idx.
* @param idx the index to search in.
* @throws IndexOutOfBoundsException if index is out of
range.
*/
Object get( int idx );
(…)
Collection - 26
Cristina Ribeiro
Collection-13
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Interface de List
em weiss.util
/**
* Changes the item at position idx.
* @param idx the index to change.
* @param newVal the new value.
* @return the old value.
* @throws IndexOutOfBoundsException if index is out of range.
*/
Object set( int idx, Object newVal );
/**
* Obtains a ListIterator object used to traverse the collection
bidirectionally.
* @return an iterator positioned prior to the requested element.
* @param idx the index to start the iterator. Use size() to do
complete
* reverse traversal. Use 0 to do complete forward traversal.
* @throws IndexOutOfBoundsException if idx is not between 0 and
size(), inclusive.
*/
ListIterator listIterator( int pos );
}
Collection - 27
Interface de ListIterator
em weiss.util
package weiss.util;
/**
* ListIterator interface for List interface.
*/
public interface ListIterator extends Iterator
{
/**
* Tests if there are more items in the collection
* when iterating in reverse.
* @return true if there are more items in the collection
* when traversing in reverse.
*/
boolean hasPrevious( );
/**
* Obtains the previous item in the collection.
* @return the previous (as yet unseen) item in the
collection
* when traversing in reverse.
*/
Object previous( );
}
/**
* Remove the last item returned by next or previous.
* Can only be called once after next or previous.
*/
void remove( );
Collection - 28
Cristina Ribeiro
Collection-14
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
List e ListIterator
em java.util
• Implementações da interface List
– ArrayList
• apropriado quando inserções são no fim da list
• acesso indexado rápido
– LinkedList
• inserção com mesmo custo em qualquer ponto
• acesso indexado lento- é preciso percorrer a lista
– Vector
• anterior à biblioteca de colecções
• implementação com array
• Remoção com iterador ListIterator
• remove o elemento mais recentemente visto com next() ou
previous()
• só se pode chamar 1 vez entre chamadas de next() e previous()
Collection - 29
Classe LinkedList
em java.util
public class LinkedList
extends AbstractSequentialList
implements List, Cloneable, Serializable
Linked list implementation of the List interface. Implements
all optional list operations, and permits all elements
(including null). In addition to implementing the List
interface, the LinkedList class provides uniformly named
methods to get, remove and insert an element at the beginning
and end of the list. These operations allow linked
lists to be used as a stack, queue, or double-ended queue
(deque).
void addFirst(Object o)
void addLast(Object o)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()
Collection - 30
Cristina Ribeiro
Collection-15
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Exemplo: List com ArrayList
import java.util.*;
public class TestList{
public static void main( String [ ] args )
{
List
lista = new ArrayList();
List
lista2 = new ArrayList();
ListIterator itr = lista.listIterator();
ListIterator itr2 = lista2.listIterator();
// inserir 10 elementos
for( int i = 0; i < 10; i++ )
itr2.add( new Integer( i ) );
itr2 = lista2.listIterator(0);
lista.addAll(lista2);
// Reset ao itr2
//copiar todos,método de Collection
System.out.print( "Mostrar primeira:" );
for( itr= lista.listIterator( ); itr.hasNext(); )
System.out.print( " " + itr.next() );
System.out.println( " fim." );
System.out.print( "Mostrar segunda:" );
for( itr2= lista.listIterator(); itr2.hasNext(); )
System.out.print( " " + itr2.next() );
System.out.println( " fim." );
}}
Collection - 31
Exemplo de List
import java.util.*;
// testar Interface List em Collections
// Array pode ser visto como lista (sem ser copiado)
public class TestList2
{
public static void replace(List l, Object val, Object newVal)
{
for (ListIterator i = l.listIterator(); i.hasNext(); )
if (val==null ? i.next()==null : val.equals(i.next()))
i.set(newVal);
}
public static void main( String [ ] args )
{
List lista = Arrays.asList(args);
Collections.shuffle(lista);
System.out.println(lista);
replace(lista, "1", "100");
System.out.println(lista);
}}
Collection - 32
Cristina Ribeiro
Collection-16
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Stack em weiss.util
package weiss.util;
import java.io.Serializable;
/**
* Stack class. Unlike java.util.Stack, this is not
* extended from Vector. This is the minimum respectable
* set of operations.
*/
public class Stack implements Serializable
{
private ArrayList items;
/**
* Constructs an empty stack.
*/
public Stack( )
{
items = new ArrayList( );
}
Collection - 33
Stack em weiss.util
/**
* Adds an item to the top of the stack.
* @param x the item to add.
* @return the item added.
*/
public Object push( Object x )
{
items.add( x );
return x;
}
/**
* Removes and returns item from the top of the stack.
* @return the former top item.
* @throws EmptyStackException if stack is empty.
*/
public Object pop( )
{
if( isEmpty( ) )
throw new EmptyStackException( );
return items.remove( items.size( ) - 1 );
}
Collection - 34
Cristina Ribeiro
Collection-17
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Stack em weiss.util
/**
* Returns item from the top of the stack.
* @return the top item.
* @throws EmptyStackException if stack is empty.
*/
public Object peek( )
{
if( isEmpty( ) )
throw new EmptyStackException( );
return items.get( items.size( ) - 1 );
}
/**
* Tests if stack is empty.
* @return true if the stack is empty; false otherwise.
*/
public boolean isEmpty( )
{
return size( ) == 0;
}
Collection - 35
Stack em weiss.util
/**
* Returns
* @return
*/
public int
{
return
}
the size of the stack.
the size of the stack.
size( )
items.size( );
public void clear( )
{
items.clear( );
}
public String toString( )
{
StringBuffer result = new StringBuffer( );
for( int i = size( ) - 1; i >= 0; i-- )
result.append( items.get( i ) );
return result.toString( );
}
}
Collection - 36
Cristina Ribeiro
Collection-18
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Stack em java.util
• Class Stack- subclasse de Vector
boolean empty()
Tests if this stack is empty.
Object peek()
Looks at the object at the top of this stack without removing it from the stack.
Object pop()
Removes the object at the top of this stack and
returns that object as the value of this function.
Object push(Object item)
Pushes an item onto the top of this stack.
int search(Object o)
Returns the 1-based position where an object is on this stack.
• Alternativa: usar List e restringir operações
Collection - 37
Queue em weiss.nonstandard
package weiss.nonstandard;
// Queue interface
// ******************PUBLIC OPERATIONS*********************
// void enqueue( x )
--> Insert x
// Object getFront( )
--> Return least recently inserted item
// Object dequeue( )
--> Return and remove least recent item
// boolean isEmpty( )
--> Return true if empty; else false
// void makeEmpty( )
--> Remove all items
// ******************ERRORS********************************
// getFront or dequeue on empty queue
public interface Queue
{
/**
* Insert a new item into the queue.
* @param x the item to insert.
*/
void enqueue( Object x );
Collection - 38
Cristina Ribeiro
Collection-19
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Queue em weiss.nonstandard
/**
* Get the least recently inserted item in the queue.
* Does not alter the queue.
* @return the least recently inserted item in the queue.
* @exception UnderflowException if the queue is empty.
*/
Object getFront( );
/**
* Return and remove the least recently inserted item
* from the queue.
* @return the least recently inserted item in the queue.
* @exception UnderflowException if the queue is empty.
*/
Object dequeue( );
/**
* Test if the queue is logically empty.
* @return true if empty, false otherwise.
*/
boolean isEmpty( );
}
/**
* Make the queue logically empty.
*/
void makeEmpty( );
Collection - 39
Queue em java.util
• Biblioteca não tem classe para queue
– Pode usar-se List restringindo operações
void addLast(Object o)
Appends the given element to the end of this list.
Object getFirst()
Returns the first element in this list.
Object removeFirst()
Removes and returns the first element from this list.
Collection - 40
Cristina Ribeiro
Collection-20
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Hierarquia de Set e Map em Collection
Collection
AbstractCollection
Set
Map
SortedSet
AbstractSet
TreeSet
HashSet
AbstractMap
HashMap
SortedMap
TreeMap
Collection - 41
Interface de Set
public interface Set {
// Basic Operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(Object element);
// Optional
boolean remove(Object element); // Optional
Iterator iterator();
// Bulk Operations
boolean containsAll(Collection c);
boolean addAll(Collection c);
//
boolean removeAll(Collection c); //
boolean retainAll(Collection c); //
void clear();
//
Optional
Optional
Optional
Optional
// Array Operations
Object[] toArray();
Object[] toArray(Object a[]);
}
Cristina Ribeiro
Collection - 42
Collection-21
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Map e SortedMap
• Mapeiam chaves em valores
– não admitem duplicados
– cada chave mapeia em 1 valor no máximo
• Map
– implementações: AbstractMap, HashMap,
Hashtable, RenderingHints, WeakHashMap,
Attributes
• SortedMap
– mantém as chaves em ordem crescente de chaves
– uso: dicionários e listas telefónicas
– implementações: TreeMap
Collection - 43
Interface de Map
public interface Map {
// Basic Operations
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// Bulk Operations
void putAll(Map t);
void clear();
// Collection Views
public Set keySet();
public Collection values();
public Set entrySet();
Cristina Ribeiro
(…)
Collection - 44
Collection-22
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Interface de Map
public interface Map {
(…)
// Interface for entrySet elements
public interface Entry {
Object getKey();
Object getValue();
Object setValue(Object value);
}
}
Vistas como colecções: permitem iterar
for (Iterator i=m.keySet().iterator(); i.hasNext(); )
System.out.println(i.next());
• vista de colecção permite remover
• vista de colecção não permite inserir
Collection - 45
Interfaces SortedSet e SortedMap
public interface SortedSet extends Set {
// Range-view
SortedSet subSet(Object fromElement, Object toElement);
SortedSet headSet(Object toElement);
SortedSet tailSet(Object fromElement);
// Endpoints
Object first();
Object last();
// Comparator access
Comparator comparator();
}
public interface SortedMap extends Map {
Comparator comparator();
SortedMap subMap(Object fromKey, Object toKey);
SortedMap headMap(Object toKey);
SortedMap tailMap(Object fromKey);
Object first();
Object last();
Cristina Ribeiro
}
Collection - 46
Collection-23
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Exemplo de Set
import java.util.*;
public class FindDups {
public static void main(String args[]) {
Set uniques = new HashSet();
Set dups = new HashSet();
for (int i=0; i<args.length; i++)
if (!uniques.add(args[i]))
dups.add(args[i]);
uniques.removeAll(dups);
// Destructive
// set-difference
System.out.println("Unique words:
" + uniques);
System.out.println("Duplicate words: " + dups);
}
}
Collection - 47
Exemplo de Map
import java.util.*;
public class Freq {
private static final Integer ONE = new Integer(1);
public static void main(String args[]) {
Map m = new HashMap();
// Initialize frequency table from command line
for (int i=0; i<args.length; i++) {
Integer freq = (Integer) m.get(args[i]);
m.put(args[i], (freq==null ? ONE :
new Integer(freq.intValue()
+ 1)));
}
System.out.println(m.size()+
" distinct words detected:");
System.out.println(m);
}
Collection - 48
Cristina Ribeiro
Collection-24
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Conversão entre colecção e array
• Métodos toArray permitem traduzir Collection
para vector para uso em métodos que o exijam
Object[] a = c.toArray();
– cria novo vector da dimensão da colecção e copia
String[] a = (String[]) c.toArray(new
String[0]);
– cria novo vector usando o tipo do argumento e com a
dimensão da colecção e copia
Collection - 49
Classe Arrays
• Métodos para manipular arrays e para os tratar como listas
– Tratar array como lista
static List asList(Object[] a)
Returns a fixed-size list backed by the specified array.
– 1 método para cada tipo primitivo e um para Object
• Pesquisa binária
static int binarySearch(byte[] a, byte key)
• Igualdade
static boolean equals(double[] a, double[] a2)
• Preencher array
static void fill(boolean[] a, boolean val)
• Ordenar
static void sort(float[] a)
• Ordenar com comparador
static void sort(Object[] a, Comparator c)
Collection - 50
Cristina Ribeiro
Collection-25
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Testar iteradores sobre colecções
import
import
import
import
import
import
import
import
import
import
java.util.Comparator;
java.util.Collection;
java.util.Collections;
java.util.Iterator;
java.util.List;
java.util.Set;
java.util.ArrayList;
java.util.LinkedList;
java.util.TreeSet;
java.util.HashSet;
/**
* Illustrates use of Comparator for ignoring case distinctions.
*/
class IgnoreCase implements Comparator
{
public int compare( Object obj1, Object obj2 )
{
String s1 = (String) obj1;
String s2 = (String) obj2;
return s1.compareToIgnoreCase( s2 );
}
}
Collection - 51
Testar iteradores sobre colecções 2
/**
* Test program for lots of collections.
*/
class IteratorTest
{
/**
* Print any collection.
*/
public static void printCollection( Collection c )
{
Iterator itr = c.iterator( );
}
while( itr.hasNext( ) )
System.out.print( itr.next( ) + " " );
System.out.println( );
public static void main( String [ ] args )
{
List l1 = new ArrayList( );
l1.add( "Jack" );
l1.add( "Jill" );
l1.add( "Bill" );
List
Set
Set
Set
Set
l2
s1
s2
s3
s4
=
=
=
=
=
new
new
new
new
new
LinkedList( l1 );
TreeSet( l1 );
HashSet( l1 );
TreeSet( Collections.reverseOrder( ) );
TreeSet( new IgnoreCase( ) );
Collection - 52
Cristina Ribeiro
Collection-26
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Testar iteradores sobre colecções 3
s3.add( "joe" );
s3.add( "bob" );
s3.add( "hal" );
s4.add( "Jeb!" );
s4.add( "jill" );
s4.add( "jack" );
printCollection(
printCollection(
printCollection(
printCollection(
printCollection(
printCollection(
List stud1
stud1.add(
stud1.add(
stud1.add(
l1
l2
s1
s2
s3
s4
);
);
);
);
);
);
//
//
//
//
//
//
Jack Jill Bill
Jack Jill Bill
Bill Jack Jill
Some unspecified order
joe hal bob
jack Jeb! jill
= new ArrayList( );
new SimpleStudent( "Bob", 0 ) );
new SimpleStudent( "Joe", 1 ) );
new SimpleStudent( "Bob", 2 ) ); // duplicate
Set
Set
}}
stud2 = new TreeSet( stud1 );
// will only have 2 items
stud3 = new HashSet( stud1 );
// will only have 2 items, if hashCode is
// implemented. Otherwise will have 3
// because duplicate will not be detected.
printCollection( stud1 ); // Bob Joe Bob
printCollection( stud2 ); // Bob Joe
printCollection( stud3 ); // Two items in unspecified order
Collection - 53
Testar iteradores sobre colecções 4
class SimpleStudent implements Comparable
{
String name;
int id;
public SimpleStudent( String n, int i )
{
name = n;
id = i;}
public String toString( )
{
return name + " " + id;}
public boolean equals( Object rhs )
{
if( rhs == null || getClass( ) != rhs.getClass( ) )
return false;
}
SimpleStudent other = (SimpleStudent) rhs;
return name.equals( other.name );
public int compareTo( Object other )
{
return name.compareTo( ((SimpleStudent)other).name );}
public int hashCode( )
{
return name.hashCode( );}}
Collection - 54
Cristina Ribeiro
Collection-27
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Testar Map
import
import
import
import
import
weiss.util.Map;
weiss.util.TreeMap;
weiss.util.Set;
weiss.util.Iterator;
weiss.util.Comparator;
public class MapDemo
{
public static void printMap( String msg, Map m )
{
System.out.println( msg + ":" );
Set entries = m.entrySet( );
Iterator itr = entries.iterator( );
while( itr.hasNext( ) )
{
Map.Entry thisPair = (Map.Entry) itr.next( );
System.out.print( thisPair.getKey( ) + ": " );
System.out.println( thisPair.getValue( ) );
}
}
Collection - 55
Testar Map 2
// Do some inserts and printing (done in printMap).
public static void main( String [ ] args )
{
Map phone1 = new TreeMap( );
phone1.put( "John Doe", "212-555-1212" );
phone1.put( "Jane Doe", "312-555-1212" );
phone1.put( "Holly Doe", "213-555-1212" );
System.out.println( "phone1.get(\"Jane Doe\"): " +
phone1.get( "Jane Doe" ) );
System.out.println( );
printMap( "phone1", phone1 );
}
}
Collection - 56
Cristina Ribeiro
Collection-28
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Fila de Prioridade
package weiss.nonstandard;
// PriorityQueue interface
//
// ******************PUBLIC OPERATIONS*********************
// Position insert( x )
--> Insert x
// Comparable deleteMin( )--> Return and remove smallest item
// Comparable findMin( )
--> Return smallest item
// boolean isEmpty( )
--> Return true if empty; else false
// void makeEmpty( )
--> Remove all items
// int size( )
--> Return size
// void decreaseKey( p, v)--> Decrease value in p to v
// ******************ERRORS********************************
// Throws UnderflowException for findMin and deleteMin when empty
Collection - 57
Interface de fila de prioridade
/**
* PriorityQueue interface.
* Some priority queues may support a decreaseKey operation,
* but this is considered an advanced operation. If so,
* a Position is returned by insert.
* Note that all "matching" is based on the compareTo method.
* @author Mark Allen Weiss
*/
public interface PriorityQueue
{
/**
* The Position interface represents a type that can
* be used for the decreaseKey operation.
*/
public interface Position
{
/**
* Returns the value stored at this position.
* @return the value stored at this position.
*/
Comparable getValue( );}
Collection - 58
Cristina Ribeiro
Collection-29
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Interface de fila de prioridade 2
/**
* Insert into the priority queue, maintaining heap order.
* Duplicates are allowed.
* @param x the item to insert.
* @return may return a Position useful for decreaseKey.
*/
Position insert( Comparable x );
/**
* Find the smallest item in the priority queue.
* @return the smallest item.
* @throws UnderflowException if empty.
*/
Comparable findMin( );
/**
* Remove the smallest item from the priority queue.
* @return the smallest item.
* @throws UnderflowException if empty.
*/
Comparable deleteMin( );
Collection - 59
Interface de fila de prioridade 3
/**
* Test if the priority queue is logically empty.
* @return true if empty, false otherwise.
*/
boolean isEmpty( );
/**
* Make the priority queue logically empty.
*/
void makeEmpty( );
/**
* Returns the size.
* @return current size.
*/
int size( );
/**
* Change the value of the item stored in the pairing heap.
*/
void decreaseKey( Position p, Comparable newVal );}
Collection - 60
Cristina Ribeiro
Collection-30
LEIC-FEUP 2001/2002
Algoritmos e Estruturas de Dados 1
Testar Fila de Prioridade
import weiss.nonstandard.PriorityQueue;
import weiss.nonstandard.BinaryHeap;
public class PriorityQueueDemo
{
public static void dumpPQ( String msg, PriorityQueue pq )
{
System.out.println( msg + ":" );
while( !pq.isEmpty( ) )
System.out.println( pq.deleteMin( ) );}
// Do some inserts and removes (done in dumpPQ).
public static void main( String [ ] args )
{
PriorityQueue minPQ = new BinaryHeap( );
minPQ.insert( new Integer( 4 ) );
minPQ.insert( new Integer( 3 ) );
minPQ.insert( new Integer( 5 ) );
dumpPQ( "minPQ", minPQ );
}}
Collection - 61
Cristina Ribeiro
Collection-31
Download