Colecciones Java - dccia - Universidad de Alicante

Anuncio
Razonamiento Geométrico
Definición de framework
El framework de colecciones de Java
1.2
! Framework: término usado en programación orientada
a objetos para definir un conjunto de clases que
definen un diseño abstracto para solucionar un
conjunto de problemas relacionados
! ¿Qué diferencia hay entre framework y patrón?
" El nivel de abstracción de un patrón es mayor que el del
framework
" Ejemplos de patrones
• MVC: modelo/vista/controlador
• Singleton: objeto único
• DAO: Data Access Object
Copyright © 2008-2009 Universidad de Alicante
1
Copyright © 2008-2009 Universidad de Alicante
2
¿Qué se define en un framework?
Ejemplos de frameworks
! Ejemplo: Swing
! Swing: framework de interfaces gráficas de usuario
" Un conjunto de clases e interfaces. Por ejemplo, las clases
que define distintos tipos de componentes (Jbutton,
Jtable, …) o las interfaces de gestión de eventos
(MouseListener, …)
" Modelos de uso de las clases e interfaces. Por ejemplo, pasos
para definir una GUI.
" Modelo de funcionamiento del framework en tiempo de
ejecución, en el que hay que “enganchar” los nuevos objetos
añadidos por nosotros. Por ejemplo, definición y tratamiento
de eventos.
Copyright © 2008-2009 Universidad de Alicante
3
! Jakarta Struts: framework de aplicaciones web en Java
basado en el patrón MVC
! JMF (Java Media Framework): framework para el
tratamiento de contenidos multimedia (audio, vídeo,
etc.)
! JAI (Java Advanced Imaging): framework para el
procesamiento de imágenes en Java
Copyright © 2008-2009 Universidad de Alicante
4
La interfaz Iterator
Métodos equals y hashCode
! La interfaz java.util.Iterator se usa para
recorrer las colecciones posicionales
! La comparación entre objetos Java se realiza con el operador
== y el método equals. Java utiliza el primero para comparar
igualdad de referencia (dos variables apuntan al mismo “objeto
físico”) y el segundo para igualdad de contenidos.
Interface Iterator {
boolean hasNext();
Object next();
void remove();
}
! La clase java.lang.Object define un método equals por
defecto que utiliza la igualdad de referencia. Si queremos
implementar la igualdad de contenidos en los objetos de
nuestras clases, hay que sobreescribir este método.
! Ejemplo
! El método hashCode también se define en la superclase
Object y devuelve un int que define la clave hash de un
objeto. Debe ser compatible con equals (si equals devuelve
true, hashCode debe devolver el mismo int para dos
objetos).
Interator it = puntos.iterator();
while (it.hasNext()) {
Point2D p = (Point2D) it.next();
canvas.draw(p);
}
Copyright © 2008-2009 Universidad de Alicante
5
La interfaz Comparable
6
Ejemplo de Comparable
! La interfaz java.lang.Comparable define un
único método
public interface Comparable {
public int compareTo(Object o);
}
! El método compareTo debe devolver un entero
negativo, 0, o positivo cuando el objeto que recibe el
mensaje es menor, igual o mayor que el Object o
pasado como parámetro.
! Es aconsejable que el método sea consistente con
equals, esto es, devuelva 0 si y sólo si los dos objetos
que se comparan con equals son iguales.
Copyright © 2008-2009 Universidad de Alicante
Copyright © 2008-2009 Universidad de Alicante
7
public boolean equals(Object o) {
if (!(o instanceof Punto2D))
return false;
Punto2D punto = (Punto2D) o;
return (x == punto.x) && (y == punto.y);
}!
public int compareTo(Object o) {
if (this.equals(o))
return 0; // consistente con equals
Punto2D punto = (Punto2D) o;
if (x >= punto.x && y > punto.y)
return 1;
return -1;
}
}
Copyright © 2008-2009 Universidad de Alicante
8
Ejemplos de frameworks de
colecciones
Definición de un framework para
colecciones
! C++: STL (Standard Template Library)
! Framework de colecciones
" arquitectura unificada para representar y manipular
colecciones
" independiente de los detalles de representación
! Java 1.2: Collection Framework
! Java: JDSL
! Colección: agrupación de objetos
! Dos grandes tipos de colecciones:
" Acceso por posición (listas, conjuntos, …)
" Acceso por clave (diccionarios, …)
Copyright © 2008-2009 Universidad de Alicante
9
Copyright © 2008-2009 Universidad de Alicante
¿Qué contiene un framework de
colecciones?
Colecciones en Java
! Interfaces
! Arrays
" TADs que definen la funcionalidad
10
" La clase más sencilla, está fuera del framework collection
! Implementaciones
! Iterator
" Clases que implementan las interfaces de las colecciones
" Un TAD (por ejemplo Secuencia o Lista) puede tener más de
una implementación
! Algoritmos
" métodos que realizan computaciones, como búsquedas u
ordenaciones, sobre objetos que implementan las interfaces
Copyright © 2008-2009 Universidad de Alicante
11
" Iterator
! Colecciones
" Collection
" Set
" List
" Map
Copyright © 2008-2009 Universidad de Alicante
12
Arrays en Java
Interfaces de las colecciones
! Los Arrays son el tipo más sencillo de colección
! Las colecciones se definen por la siguiente jerarquía de
interfaces
Point2D[] puntos;
puntos = new Point2D [100];
for (int i=0; i <= puntos.length(); i++)
puntos[i]= new Point2D();
! El tipo de los objetos del array debe declarase en
tiempo de compilación.
[Fuente: Tutorial del Java de Sun]
! La clase java.utils.Array proporciona un conjunto
de métodos auxiliares estándar:
" Ordenación y búsqueda basada en el algoritmo quicksort:
sort(), binarySearch()
Copyright © 2008-2009 Universidad de Alicante
13
La interfaz Collection
Copyright © 2008-2009 Universidad de Alicante
14
! Es la misma que Collection, con la particularidad de que no
se permiten objetos iguales en la colección.
! Implementación HashSet
" Usa una tabla hash
" No introduce orden en sus elementos
" Los métodos add, remove y contains son muy eficientes: O(c)
// Bulk Operations
boolean containsAll(Collection c);
boolean addAll(Collection c); // Optional
boolean removeAll(Collection c); // Optional
boolean retainAll(Collection c); // Optional
void clear(); // Optional
! Implementación TreeSet
" Usa un árbol
" Introduce un orden en los elementos, útil para recorrer el conjunto
" Los métodos add, remove y contains son O(log (n))
// Array Operations
Object[] toArray();
Object[] toArray(Object a[]);
Copyright © 2008-2009 Universidad de Alicante
" Se separa la especificación de la implementación
" Es más sencillo reemplazar el funcionamiento de una clase por otra que
implementa la misma interfaz y que es más eficiente
La interfaz Set, implementaciones
public interface Collection {
// Basic Operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(Object element); // Optional
boolean remove(Object element); // Optional
Iterator iterator();
}
! Ventajas de definir interfaces:
15
Copyright © 2008-2009 Universidad de Alicante
16
La interfaz List
Ejemplo
import java.util.*;
public class FindDups {
public static void main(String args[]) {
Set s = new HashSet();
for (int i=0; i<args.length; i++)
if (!s.add(args[i]))
System.out.println("Duplicate detected: "+args[i]);
System.out.println(s.size()+" distinct words detected: "+s);
}
public interface List extends Collection {
// Positional Access
Object get(int index);
Object set(int index, Object element);
void add(int index, Object element);
Object remove(int index);
abstract boolean addAll(int index, Collection c);
Optional
Optional
Optional
Optional
// Search
int indexOf(Object o);
int lastIndexOf(Object o);
}
// Iteration
ListIterator listIterator();
ListIterator listIterator(int index);
% java FindDups i came i saw i left
Duplicate detected: i
Duplicate detected: i
4 distinct words detected: [came, left, saw, i]
Copyright © 2008-2009 Universidad de Alicante
//
//
//
//
}
// Range-view
List subList(int from, int to);
17
Implementaciones de List
Copyright © 2008-2009 Universidad de Alicante
18
Ejemplo de ArrayList
import java.util.*;
public class Shuffle {
public static void main(String args[]) {
List l = new ArrayList();
for (int i = 0; i < args.length; i++)
l.add(args[i]);
Collections.shuffle(l, new Random());
System.out.println(l);
}
}
! ArrayList
" Usa un array extensible como implementación
" Operaciones get y set en tiempo constante
! LinkedList
" Basada en una lista doblemente enlazada
" Operaciones add y remove en tiempo constante
Aún más corto:
import java.util.*;
public class Shuffle {
public static void main(String args[]) {
List l = Arrays.asList(args);
Collections.shuffle(l);
System.out.println(l);
}
}
Copyright © 2008-2009 Universidad de Alicante
19
Copyright © 2008-2009 Universidad de Alicante
20
Ejemplo de LinkedList
El iterador ListIterator
import java.util.*;
public class MyStack {
private LinkedList list = new LinkedList();
public void push(Object o){
list.addFirst(o);
}
public Object top(){
return list.getFirst();
}
public Object pop(){
return list.removeFirst();
}
}
public interface ListIterator extends Iterator {
boolean hasNext();
Object next();
boolean hasPrevious();
Object previous();
int nextIndex();
int previousIndex();
public static void main(String args[]) {
Point2D punto;
MyStack s = new MyStack();
s.push (new Point2D());
punto = (Point2D)s.pop();
}
Copyright © 2008-2009 Universidad de Alicante
}
void remove(); // Optional
void set(Object o); // Optional
void add(Object o); // Optional
21
La interfaz Map
Copyright © 2008-2009 Universidad de Alicante
22
La interfaz Map
! Un Map (correspondencia) es un objeto que asocia una clave a
un valor. También se denomina Diccionario.
! Métodos para añadir y borrar:
" put(Object key, Object value)
" remove(Object key)
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();
! Métodos para la extracción de objetos
" get(Object key)
// Collection Views
public Set keySet();
public Collection values();
public Set entrySet();
! Métodos para obtener las claves, los valores y las parejas (clave,
valor) como un conjunto
" keySet() // devuelve un set
" values() // devuelve un collection
" entrySet() // devuelve un set
// Interface for entrySet elements
public interface Entry {
Object getKey();
Object getValue();
Object setValue(Object value);
}
}
Copyright © 2008-2009 Universidad de Alicante
23
Copyright © 2008-2009 Universidad de Alicante
24
Implementación de Map
Ejemplo
! HashMap
import java.util.*;
public class Freq {
private static final Integer ONE = new Integer(1);
public static void main(String args[]) {
Map m = new HashMap();
" Basado en una tabla hash
" No se realiza ninguna ordenación en las parejas (clave,
valor)
// 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)));
}
! TreeMap
" Basado en un árbol rojo-negro
" Las parejas (clave, valor) se ordenan sobre la clave
}
Copyright © 2008-2009 Universidad de Alicante
25
}
System.out.println(m.size()+ " distinct words detected:");
System.out.println(m);
Copyright © 2008-2009 Universidad de Alicante
26
Descargar