Download Informática III

Document related concepts
no text concepts found
Transcript
Informática 5260
Contenedores Asociativos:
SET
MAP
Contenedores asociativos (1)
Los contenedores asociativos son una
extensión de las secuencias. Mientras que en
estas para acceder a los elementos solo pueden
utilizarse claves numéricas, que señalan el
número de orden del elemento dentro de la
secuencia (al estilo de los índices en las
matrices).
Los contenedores asociativos admiten cualquier
tipo de clave de acceso. Las más frecuentes son
las cadenas alfanuméricas (strings).
Contenedores asociativos (2)
 Las asociaciones almacenan sus miembros en forma
de árbol indexado, razón por la que son denominados
también contenedores asociativos ordenados, y resultan
adecuados para accesos aleatorios mediante claves.
 La ordenación se realiza según los valores de ciertos
miembros del contenedor. Estos elementos son
denominados "de claves" ("Key values"). Lo que exige
que los objetos "de clave" sean de un tipo para el que
estén definidos los operadores relacionales. El
contenedor es mantenido ordenado de forma
automática por los algoritmos de inserción y borrado.
Contenedores asociativos (3)
 Un contenedor asociativo almacena objetos de forma
ordenada basandose en una llave. La llave puede ser el
propio objeto (como es el caso de los conjuntos) o ser
otro tipo completamente diferente (como en el caso de
los diccionarios).
 Existen cuatro tipos de contenedores asociativos:
sin llaves repetidas
con llaves repetidas
llave
set
multiset
llave + datos
map
multimap
Contenedores asociativos (4)
Tanto los set y los map se pueden
implementar usando las clases contenidas en
la JAVA COLLECTIONS FRAMEWORK (JCF).
En cambio, multiset y multimap se
implementan de una forma mas cómoda y
eficiente usando las clases del Proyecto
Guava, anteriormente conocido como Google
Collections.
La interface Set
 Colección que no puede contener elementos
duplicados. Abstracción del concepto
matemático de conjunto.
 Contiene los métodos heredados de Collection.
 Sólo añade restricciones para prohibir
elementos duplicados.
 Los elementos no están ordenados
La interface Set
 La interface Set representa un conjunto de
objetos, lo cual significa que cada elemento puede
existir solamente una vez en el Set.
 Implementaciones de Set: Al ser un subtipo de
Collection, todos los métodos de Collection se
encuentran disponibles en Set.
 Como Set es una interface, es necesario instanciar
una implementación concreta de la interfaz para
poder usarla.
La interface Set
 Existen varias clases en el API de Java que
implementan la interfaz Set:
CLASES:
• java.util.EnumSet
• java.util.HashSet
• java.util.LinkedHashSet
• java.util.TreeSet
EJEMPLOS:
Set setA = new EnumSet();
Set setB = new HashSet();
Set setC = new LinkedHashSet();
Set setD = new TreeSet();
Cada una de estas implementaciones se comporta de manera ligeramente
distinta respecto al orden de los elementos cuando se itera el Set, y en el
tiempo que toma el insertar y agregar elementos a los sets.
La interface Set
 HashSet es respaldado por un HashMap. No garantiza
la secuencia de los elementos cuando éstos son
iterados.
 LinkedHashSet difiere de un HashSet , ya que
garantiza que el orden de los elementos durante la
iteración es el mismo orden en el cual fueron insertados.
 Reinsertar un elemento que ya se encontraba en el
LinkedHashSet no cambia su orden.
La interface Set
 TreeSet también garantiza el orden de los elementos al
iterarlos, pero el orden es el orden de ordenamiento de
los elementos. En otras palabras, el orden en el cual
dichos elementos se almacenarían si se utilizara el
método Collections.sort() en una lista o arreglo que
contenga dichos elementos.
 Este orden es determinado por su orden natural (si
implementan la interfaz Comparable) o mediante un
comparador (Comparator) específico para la
implementación.
Uso de Set
Set set = new HashSet(); // instancia de un set concreto
// ...
set.add(obj); // inserta elementos
// ...
int n = set.size(); // obtiene tamaño
// ...
if (set.contains(obj)) {...} // verifica miembro
// iterata a través del set
Iterator iter = set.iterator();
while (iter.hasNext()) {
Object e = iter.next();
// downcast e
// ...
}
Métodos más Usados
de la Interface Set






add(i,o) Inserta o en la posición i
add(o) Añade o al final
get(i)
Devuelve el i-ésimo elemento
remove(i) Eliminia e i-ésimo elemento
remove(o) Elimina el elemento o
set(i,o)
Remplaza el i-ésimo
elemento con o
Ejemplo1: Set
 Cuando se iteran los elementos de un Set el orden de
los elementos depende de cuál implementación de Set
se utilice como se mencionó anteriormente. Un ejemplo
de sus uso sería:
Set setA = new HashSet();
setA.add("elemento 0");
setA.add("elemento 1");
setA.add("elemento 2");
Ejemplo2: Set
// acceso mediante iterador
Iterator iterador = setA.iterator();
while(iterador.hasNext(){
String elemento = (String) iterador.next();
}
// acceso mediante ciclo for
for(Object objecto : setA) {
String elemento = (String) objecto;
}
 Los elementos se remueven llamando al método remove(Object o).
No hay manera de remover un objeto mediante un índice en un Set,
ya que el orden de los elementos depende de la implementación.
Ejemplo2: Set
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(" duplicado: "+args[i]);
System.out.println(s.size()+" palabras detectadas: "+s);
}
}
Sets Genéricos
 Por default se puede almacenar cualquier tipo de objeto
en un Set; sin embargo, es posible limitar el tipo de
objetos que se pueden insertar mediante el uso de
genéricos. Un ejemplo:
Set<MyObject> set = new HashSet<MyObject>();
 Este Set ahora únicamente puede tener instancias
MyObject dentro de él. Se puede acceder e iterar sus
elementos sin realizar casting:
for(MyObject anObject : set){
//do someting to anObject...
}
Interface SortedSet
 Conjunto que mantiene los elementos ordenados en
forma ascendente
 los elementos deben implementar Comparable o
 se debe suministrar un Comparator en el
momento de la creación
 Operaciones: Iterator atraviesa SortedSet en orden.
 Operaciones adicionales:
 de vista de rango
 se puede retornar el primer o el último elemento
 acceso al Comparator
Interface SortedSet
 En el API de Java existe únicamente una clase que
implementa SortedSet: java.util.TreeSet.
 Ejemplos sobre cómo instanciar un SortedSet:
SortedSet setOrdenadoA = new TreeSet();
Comparator comparador = new MyComparator();
SortedSet setOrdenadoB = new TreeSet(comparador);
La interface Map
 Colección de pares clave/valor (tabla-diccionario)
 No puede contener claves duplicadas
 Una clave puede mapear a lo sumo un valor
 Todo objeto puede ser usado como un clave de hash
 public int Object.hashcode()
 Objetos iguales (equals()) deben producir el mismo
hashcode
 Métodos que permiten ver al mapa como colección:
 keySet- Set de claves del mapa
 values- Collection de valores del mapa
 entrySet- Set de pares claves/valor del mapa
La
interfase
Map
 Los mapas almacenan objetos basados en
llaves únicas.
 Los mapas pueden soportar elementos
repetidos, pero no llaves repetidas.
 Esta clase no extiende de la interfase Collection
Implementaciones de Map
HashMap
- Usa el algoritmo de hashing para almacenar los
elementos.
- Una implementación de Map con una tabla hash.
- El método hashCode de cada clave se utiliza
para seleccionar un lugar en la tabla.
- Una colección de utilidad muy general con
tiempos relativamente cortos de búsqueda e
inserción.
Implementaciones de Map
TreeMap
 Provee un Mapa ordenado. Los elementos deben ser
ordenables, ya sea implementando la interfase
Comparable o utilizando la clase Comparator.
 Una implementación de SortedMap utilizando un árbol
binario equilibrado que mantiene sus elementos
ordenados por clave.
 Útil para conjuntos de datos ordenados que requieren
una búsqueda por clave moderadamente rápida.
- Asume que los elementos son comparables si no se le ha
pasado un comparator en el constructor.
Interface Map











Clear()
Elimina todos las asociaciones
containsKey(k) Si contiene una asoc. para k
containsValue(v) Si contiene una asoc. para v
SetentrySet()
Conjunto de pares de valores clave
get(k)
Valor asociado con k
isEmpty()
Si está vacío
keySet()
Conjunto de claves
put(k,v)
Asociar v con k
remove(k)
Eliminar asoc. para k
size()
Número de pares
values()
Colección de valores
La interface Map
Map
// Operaciones básicas
put(Object, Object):Object;
get(Object):Object;
remove(Object):Object;
containsKey(Object):boolean;
containsValue(Object):boolean;
size():int;
isEmpty():boolean;
// Operaciones completas
void putAll(Map t):void;
void clear():void;
// Vistas como colecciones
keySet():Set;
values():Collection;
entrySet():Set;
Uso de Map
Map map = new HashMap(); // instancia un map concreto
// ...
map.put(key, val); // inserta par llave-valor
// ...
// obtiene el valor asociado a la llave
Object val = map.get(key);
map.remove(key); // elimina par llave-valor
// ...
if (map.containsValue(val)) { ... }
if (map.containsKey(kay)) { ... }
Set keys = map.keySet(); // obtiene el conjunto de llaves
// itera a través del conjunto de llaves
Iterator iter = keys.iterator();
while (iter.hasNext()) {
Key key = (Key) iter.next();
// ...
}
Ejemplo1: Map
import java.util.*;
public class Frecuencia {
private static final Integer UNO = new Integer(1);
public static void main(String args[]) {
Map m = new HashMap();
for (int i=0; i<args.length; i++) {//inicializa tabla de línea de cmd
Integer freq = (Integer) m.get(args[i]);
m.put(args[i],
(freq==null ? UNO : new Integer(freq.intValue() + 1)));
}
System.out.println(m.size()+" pal. distintas");
System.out.println(m);}}
% java Freq if it is to be it is up to me to delegate
8 pal. distintas
{to=3, me=1, delegate=1, it=2, is=2, if=1, be=1, up=1}
Ejemplo 2: MAP
1/2
Generar números al azar (Math.random) y contar
cuantas veces sale cada uno.
HashMap = Colección de pares (clave-valor)
Clave = número aleatorio generado
Valor = contador que acumula las veces que ha aparecido
class Contador {
private int i;
public Contador(){ i=1;}
public void incrementar(){++i;}
public String toString() {
return Integer.toString(i);
}
}
Ejemplo 2: MAP
2/2
class Estadistico {
public static void main( String args[] ) {
HashMap tabla = new HashMap();
for(int i=0; i < 10000; i++) {
// Generar un número entre 0 y 20
Integer num = new Integer((int)(Math.random()*20));
if(tabla.containsKey(num))
//Incrementamos el contador asociado al número
((Contador)tabla.get(num)).incrementar();
else
//Añadimos nuevo par: numero-contador
tabla.put(num, new Contador());
}
System.out.println(tabla);
}
}
Interface SortedMap
 Mapa que mantiene sus entradas en orden ascendente
 los elementos deben implementar Comparable o
 se debe suministrar un Comparator en el momento de
la creación
 Operaciones: Iterator atraviesa el SortedMap en cualquiera
de sus vistas de colección en orden de las claves
 Operaciones adicionales:
 vista de rango
 puntos finales (claves)
 acceso al Comparator