Colecciones de Java

Anuncio
Colecciones de Java
LSUB
GSYC
30 de enero de 2013
(cc) 2013 Laboratorio de Sistemas,
Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, véase
http://creativecommons.org/licenses/by-sa/2.1/es. También puede solicitarse a Creative Commons, 559 Nathan
Abbott Way, Stanford, California 94305, USA.
Colecciones
• Son estructuras genéricas que implementan estas interfaces:
Collection
Set
SortedSet
List
Queue
Map
BlockingQueue
SortedMap
Collection
p u b l i c i n t e r f a c e C o l l e c t i o n <E> e x t e n d s I t e r a b l e <E> {
int size ();
boolean isEmpty ( ) ;
b o o l e a n add ( E e l e m e n t ) ;
b o o l e a n remove ( O b j e c t e l e m e n t ) ;
boolean c o n t a i n s ( Object element ) ;
I t e r a t o r <E> i t e r a t o r ( ) ;
Object [ ] toArray ( ) ;
<T> T [ ] t o A r r a y (T [ ] a ) ;
}
Listas
• La interfaz para lista no implica que esté implementada con
una lista enlazada. Por ejemplo, estas dos clases implementan
la interfaz List:
• ArrayList: usa un array, bueno para acceso aleatorio pero lento
para insertar elementos.
• LinkedList: implementado como una lista enlazada, lento para
acceso aleatorio.
Listas
p u b l i c i n t e r f a c e L i s t <E> e x t e n d s C o l l e c t i o n <E> {
E get ( i n t index ) ;
E se t ( i n t index , E element ) ;
v o i d add ( i n t i n d e x , E e l e m e n t ) ;
E remove ( i n t i n d e x ) ;
i n t indexOf ( Object o ) ;
i n t l a s t I n d e x O f ( Object o ) ;
L i s t I t e r a t o r <E> l i s t I t e r a t o r ( ) ;
L i s t I t e r a t o r <E> l i s t I t e r a t o r ( i n t i n d e x ) ;
L i s t <E> s u b L i s t ( i n t from , i n t t o ) ;
}
Listas
L i s t <I n t e g e r > l i s t = new A r r a y L i s t <I n t e g e r > ( ) ;
f o r ( i n t i = 0 ; i < 1 0 ; i ++)
l i s t . add ( i ) ;
System . o u t . p r i n t l n ( ” t h e s e c o n d e l e m e n t i s : ” + l i s t . g e t ( 2 ) ) ;
// SALIDA :
// t h e s e c o n d e l e m e n t i s : 2
Listas
L i s t <I n t e g e r > l i s t = new A r r a y L i s t <I n t e g e r > ( ) ;
f o r ( i n t i = 0 ; i < 1 0 ; i ++)
l i s t . add ( i ) ;
l i s t . remove ( 3 ) ;
System . o u t . p r i n t l n ( l i s t ) ;
// SALIDA :
// [ 0 , 1 , 2 , 4 , 5 , 6 , 7 , 8 , 9 ]
Iteradores
p u b l i c i n t e r f a c e I t e r a t o r <E> {
boolean hasNext ( ) ;
E next ( ) ;
}
Iteradores
L i s t <I n t e g e r > l i s t = new A r r a y L i s t <I n t e g e r > ( ) ;
I t e r a t o r <I n t e g e r > i t ;
int total = 0;
f o r ( i n t i = 0 ; i < 1 0 ; i ++)
l i s t . add ( i ) ;
it = list . iterator ();
while ( i t . hasNext ( ) )
t o t a l += i t . n e x t ( ) ;
System . o u t . p r i n t l n ( ” t o t a l : ” + t o t a l ) ;
// SALIDA :
// t o t a l : 4 5
Iteradores (de lista)
Pueden ir para atrás:
L i s t <I n t e g e r > l i s t = new A r r a y L i s t <I n t e g e r > ( ) ;
L i s t I t e r a t o r <I n t e g e r > i t ;
int total = 0;
f o r ( i n t i = 0 ; i < 3 ; i ++)
l i s t . add ( i ) ;
it = list . listIterator ();
while ( i t . hasNext ( ) )
System . o u t . p r i n t ( i t . n e x t ( ) ) ;
while ( i t . hasPrevious ())
System . o u t . p r i n t ( i t . p r e v i o u s ( ) ) ;
//SALIDA :
// 012210
Set
• Conjunto sin duplicados (con equals()).
• El método add devuelve si pudo añadir o no.
Set
p u b l i c i n t e r f a c e Set<E> e x t e n d s C o l l e c t i o n <E> {
// B a s i c o p e r a t i o n s
int size ();
boolean isEmpty ( ) ;
boolean c o n t a i n s ( Object element ) ;
// o p t i o n a l
b o o l e a n add ( E e l e m e n t ) ;
// o p t i o n a l
b o o l e a n remove ( O b j e c t e l e m e n t ) ;
I t e r a t o r <E> i t e r a t o r ( ) ;
// B u l k o p e r a t i o n s
b o o l e a n c o n t a i n s A l l ( C o l l e c t i o n <?> c ) ;
// o p t i o n a l
b o o l e a n a d d A l l ( C o l l e c t i o n <? e x t e n d s E> c ) ;
// o p t i o n a l
b o o l e a n r e m o v e A l l ( C o l l e c t i o n <?> c ) ;
// o p t i o n a l
b o o l e a n r e t a i n A l l ( C o l l e c t i o n <?> c ) ;
// o p t i o n a l
void c l e a r ( ) ;
// A r r a y O p e r a t i o n s
Object [ ] toArray ( ) ;
<T> T [ ] t o A r r a y (T [ ] a ) ;
}
Queue
Además de la interfaz de una colección:
p u b l i c i n t e r f a c e Queue<E>
E element ( ) ;
boolean o f f e r (E e ) ;
E peek ( ) ;
E poll ();
E remove ( ) ;
}
e x t e n d s C o l l e c t i o n <E> {
// como add ( )
// como e l e m e n t ( )
// como remove ( )
Queue
• Algunas no son FIFO: LIFO queues, priority queues, etc.
• Algunos métodos elevan excepciones:
• add(e): inserta un elemento.
• remove(): elimina la cabeza y la devuelve.
• element(): devuelve la cabeza (no la elimina).
• Otros retornan valores especiales (null o false):
• offer(e): inserta un elemento.
• poll(): elimina la cabeza y la devuelve.
• peek(): devuelve la cabeza (no la elimina).
BlockingQueue
• Es una cola para comunicar procesos.
• Thread-safe.
• Amplı́a la interfaz con operaciones bloqueantes.
BlockingQueue
p u b l i c i n t e r f a c e B l o c k i n g Q u e u e <E> e x t e n d s Queue<E> { ;
boolean put (E e ) ;
// como add , p e r o b l o q u e a
E take ( ) ;
// como e l e m e n t ( ) , p e r o b l o q u e a
}
BlockingQueue
• Bloqueantes sin timeout:
• put(e): inserta un elemento.
• take(): elimina la cabeza y la devuelve.
• Bloqueantes con timeout:
• offer(e, time, unit): inserta un elemento.
• poll(time, unit): elimina la cabeza y la devuelve.
Map
• Una especie de diccionario: mapea claves a valores.
• No puede tener claves duplicadas.
• Cada clave se mapea a como mucho un único valor.
Map
p u b l i c i n t e r f a c e Map<K , V> {
V p u t (K key , V v a l u e ) ;
V get ( Object key ) ;
V remove ( O b j e c t k e y ) ;
boolean containsKey ( Object key ) ;
boolean containsValue ( Object value ) ;
int size ();
boolean isEmpty ( ) ;
p u b l i c Set<K> k e y S e t ( ) ;
p u b l i c C o l l e c t i o n <V> v a l u e s ( ) ;
}
SortedSet y SortedMap
• SortedSet: los elementos del conjunto están ordenados.
• SortedMap: las claves están ordenadas.
• Los elementos deben implementar la interfaz Comparable.
• Por lo demás son iguales que Set y Map.
Implementaciones
Las básicas son:
• Set: HashSet, TreeSet, LinkedHashSet.
• List: ArrayList, LinkedList.
• Map: HashMap, TreeMap, LinkedHashMap.
• SortedSet: TreeSet.
• SortedMap: TreeMap.
• Queue: LinkedList, PriorityQueue.
Thread-safeness
• Podemos crear una colección envuelta con una clase
decoradora para hacerla thread-safe.
• Para ello podemos usar los métodos de Collections
synchronizedSet o synchronizedMap
p u b l i c s t a t i c <T> Set<T> s y n c h r o n i z e d S e t ( Set<T> s ) ;
• Por ejemplo:
S e t s = C o l l e c t i o n s . s y n c h r o n i z e d S e t ( new H a s h S e t ( ) ) ;
Algoritmos
Los básicos:
• Collections.sort(list): ordena.
• Collections.suffle(list): permutación aleatoria de elementos.
• Collections.reverse(list): invierte la lista.
• Collections.binarySearch(list, key): búsqueda binaria.
• Collections.min(list): menor valor.
• Collections.max(list): mayor valor.
Descargar