Download double r = x / y
Document related concepts
no text concepts found
Transcript
Algoritmos y Programación III
4. Colecciones,
excepciones
Carlos Fontela, 2006
Temario
Colecciones e iteradores
Excepciones
Tratamiento de problemas con un enfoque optimista
Desacoplar código de tratamiento de problemas
Algoritmos y Programación III
Carlos Fontela, 2006
Página 2
Colecciones
Agrupan objetos.
Cada elemento tiene un significado similar.
El valor depende de la posición.
Se puede operar sobre:
Un elemento en particular.
Algunos elementos elegidos mediante un filtro.
La colección como conjunto.
Se definen recorridos.
Tienen diferentes interfaces,
funcionalidades y eficiencias.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 3
Colecciones (II)
Arreglos
Listas encadenadas
vectores, matrices, multidimensionales
lineales, dobles, circulares, multilistas
Árboles
binarios, generales
Algoritmos y Programación III
Carlos Fontela, 2006
Página 4
Arreglos primitivos en Java
Única colección como tipo primitivo.
Tamaño se define en tiempo de ejecución.
Seguros:
Chequeo de rangos.
Tipo de los elementos definido estáticamente.
Muy veloces
Una vez definido, no puede variar.
Salvo por chequeo de rangos.
Biblioteca de funciones pobre en
comparación.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 5
Interfaces de apoyo
public interface Comparable {
public int compareTo (Object o);
}
public interface Comparator {
public int compare (Object o1, Object o2);
public boolean equals (Object o1, Object o2);
}
Algoritmos y Programación III
Carlos Fontela, 2006
Página 6
Clase Arrays
Clase utilitaria.
Sus métodos son “de clase” o
“estáticos”.
equals(v1,v2)
sort(v)
sort (v, Comparator c)
binarySearch(v, x)
binarySearch(v, x, Comparator c)
otros...
Algoritmos y Programación III
Carlos Fontela, 2006
Página 7
Arrays.sort e interfaces (I)
Arrays.sort(v1)
Funciona bien si el tipo base de v1
• Es primitivo
• Implementa Comparable
• Usa el compareTo definido
Si no, arroja una excepción.
Para otros tipos base:
Arrays.sort(v1,c)
Hay que implementar un Comparator
Algoritmos y Programación III
Carlos Fontela, 2006
Página 8
Arrays.sort e interfaces (II)
Para ordenar Fraccion(es):
public class ComparadorFracciones
implements java.util.Comparator {
public int compare(Object o1, Object o2) {
Fraccion f1 = (Fraccion)o1; Fraccion f2 = (Fraccion)o2;
if (f1.igual(f2)) return 0;
else if (f1.mayor(f2)) return 1;
else return -1; }
}
// luego...
Comparator comp = new ComparadorFracciones();
Arrays.sort(vecFracciones, comp);
Ídem para binarySearch
Algoritmos y Programación III
Carlos Fontela, 2006
Página 9
Colecciones de java.util (I)
Las más comunes de Java 1.4:
«uses»
Iterator
«uses»
Collection
Map
«uses»
ListIterator
List
ArrayList
Algoritmos y Programación III
Carlos Fontela, 2006
Set
LinkedList
HashSet
TreeMap
HashMap
TreeSet
Página 10
Colecciones de java.util (II)
Tienen elementos de tipo Object.
No se sabe qué hay dentro.
No admiten elementos primitivos.
• Pero hay clases envolventes: Integer,
Boolean, Double, Character, etc.
Colecciones heredadas:
Vector, Hashtable, Stack, BitSet,
Properties, etc.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 11
Clase Collections
Es la Arrays de las colecciones.
(una clase utilitaria de métodos estáticos)
Algunos métodos:
void sort(Collection c, Comparator comp)
int binarySearch(Collection c, Object x,
Comparator comp)
Object max(Collection c, Comparator comp)
Object min(Collection c, Comparator comp)
void reverse()
Collection unmodifiableCollection(Collection c)
Algoritmos y Programación III
Carlos Fontela, 2006
Página 12
Iteradores (I)
Para definir recorridos.
Interfaz:
Tomar el primer elemento.
Tomar el elemento siguiente.
Testear si se termina la colección.
Un ejemplo:
List v = new ArrayList();
for(int i = 0; i < 10; i++) v.add(new Integer(i));
Iterator it = v.iterator();
// pido un iterador para v
while(it.hasNext())
// recorro la colección
System.out.println((Integer)it.next());
Algoritmos y Programación III
Carlos Fontela, 2006
Página 13
Iteradores (II)
Toda clase que implemente Collection
puede generar un Iterator con el
método iterator
«interface»
Iterator
+next() : Object
+hasNext() : boolean
«uses»
«interface»
Collection
+iterator() : Iterator
Nótese que Iterator es una interfaz
Pero está implementada para las
colecciones definidas en java.util.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 14
Iteradores (III)
Llevan la abstracción a los recorridos
de colecciones.
Facilitan cambios de implementación.
No se necesita trabajar con el
número de elementos.
Convierten a las colecciones en
simples secuencias.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 15
Iteradores antiguos
Clase Enumeration
Collections.enumeration(c)
hasMoreElements()
nextElement()
Ejemplo
Enumeration it = Collections.enumeration(v);
while(it.hasMoreElements())
System.out.println((Integer)it.nextElement());
Se usan todavía
Algoritmos y Programación III
Carlos Fontela, 2006
Página 16
Definiendo iteradores (I)
public class Matriz2D extends AbstractCollection {
int cantFilas; int cantCol;
Object [ ] [ ] m2;
public Matriz2D(int filas, int columnas) {
m2 = new Object[filas][columnas];
cantFilas = filas; cantCol = columnas;
}
public Iterator iterator() {
return new IteradorMatriz2D(this);
}
public int size() { return (cantFilas*cantCol); }
public Object get (int i, int j) { return m2[i][j]; }
// otros métodos ...
}
Algoritmos y Programación III
Carlos Fontela, 2006
Página 17
Definiendo iteradores (II)
public class IteradorMatriz2D implements Iterator {
int filaActual; int colActual; Matriz2D m2;
public IteradorMatriz2D (Matriz2D m) {
filaActual = 0; colActual = 0; m2 = m;
}
public Object next() {
if (!hasNext()) throw new NoSuchElementException();
Object o = m2.get(filaActual,colActual);
if (colActual < cantCol-1) colActual++;
else { filaActual++; colActual = 0;
}
return o;
}
public boolean hasNext() {
return !((filaActual == cantFilas-1) && (colActual == cantCol-1));
}}
Algoritmos y Programación III
Carlos Fontela, 2006
Página 18
Otras soluciones
Tipos genéricos
Ada
Clases parametrizadas
C++
• También hay iteradores, más ricos
Genericidad restringida
Eiffel
Java 5
Algoritmos y Programación III
Carlos Fontela, 2006
Página 19
Lanzamiento de excepciones
public class eDivisionPorCero extends Exception { }
----------------------------------------------------------------------------------------------------------------public static void dividir (double x, double y )
throws eDivisionPorCero {
if (y == 0)
throw new eDivisionPorCero();
else return x/y;
}
Captura de excepciones
Manejador (puede haber varios):
try {
c = dividir(a,b);
}
catch (eDivisionPorCero e) {
// hago algo...
}
finally {
// hago algo...
}
Clases de excepciones
Deben heredar de Exception o una
derivada.
Pueden tener atributos y métodos:
Para usar en la captura.
En general no se usan.
Las jerarquías influyen en la captura:
Se captura cualquier clase derivada.
Ojo con el orden de captura.
Excepciones seguras (I)
Cláusula throws es obligatoria
public static void dividir (double x, double y )
throws eDivisionPorCero {
if (y == 0) throw new eDivisionPorCero();
else return x/y;
}
A lo sumo se puede declarar un ancestro
En redefiniciones, mantener y no agregar
Para mantener el polimorfismo: muy molesto
Excepciones seguras (II)
Obligación de capturar (I)
public double suma (double[ ] x, double[ ] y) {
double s = 0;
try {
for (int i = 0; i < 10; i++)
s += dividir(x[i],y[i]);
} catch (eDivisionPorCero e) {
System.err.println(“División por cero”);
return 0;
}
return s;
}
El chequeo se hace en tiempo de compilación
Excepciones seguras (III)
Obligación de capturar (II)
public double suma (double[ ] x, double[ ] y)
throws eDivisionPorCero {
double s = 0;
for (int i = 0; i < 10; i++) s += dividir(x[i],y[i]);
return s;
}
Obligación de capturar (III)
public double suma (double[ ] x, double[ ] y) {
double s = 0;
try {
for (int i = 0; i < 10; i++) s += dividir(x[i],y[i]);
} catch (eDivisionPorCero e) { }
return s;
}
Jerarquías de excepciones
Throwable
Error
Exception
RuntimeException
Más de 29 clases y sus derivadas...
Más de 55 clases y sus derivadas...
Aserciones
Buenas para depuración
assert (b == 0): "la variable b no debe valer cero";
Respuesta:
Exception in thread "main" java.lang.AssertionError: la variable
b no debe valer cero at
PruebaAserciones.main(PruebaAserciones.java:3)
Y buenas como documentación
Comprobación de estados
Enfrentar problemas en tiempo de
ejecución:
double r = x / y;
• ¡y puede ser 0!
Matriz a = b.inversa();
• ¡b puede ser no invertible!
¿Cómo enfrentamos los problemas?
Algoritmos y Programación III
Carlos Fontela, 2006
Página 28
Enfoques conservadores (I)
if (y != 0)
double r = x / y;
else System.out.println (“Valor de y inválido”);
Estoy suponiendo que el resultado no era importante.
Y que el mensaje tiene sentido para el usuario final.
boolean error; double r;
if (y != 0)
{
r = x / y;
error = false;
} else error = true;
Supongo que el programador cliente sabrá qué hacer
con “error”.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 29
Enfoques conservadores (II)
while (y == 0) {
System.out.println(“Valor y inválido, ingrese otro”);
leer(y);
}
double r = x / y;
Supongo que el usuario final sabe de qué le estoy
hablando.
do { }
while (y != 0); // espera que el estado cambie
double r = x / y;
Supongo que otro hilo vendrá en mi ayuda.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 30
Enfoques conservadores (III)
Los más simples son ingenuos
Los parámetros de error:
Envían el problema a un contexto que tal vez
no los pueda resolver.
Son tediosos de verificar y en general no se
verifican.
Acoplan mucho el código “bueno” con el de
tratamiento de problemas.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 31
Enfoques optimistas
El conservador dice:
El optimista:
“Compruebo primero y luego actúo”.
“Pruebo actuar y resuelvo en el caso de
hallar problemas”.
¿Cómo encaro el enfoque optimista?
Excepciones.
Algoritmos y Programación III
Carlos Fontela, 2006
Página 32
Qué sigue
Modelo de datos
Clonación
Recolección de basura
Reflexión y RTTI
Paramos con la programación
Desarrollo orientado a objetos
Pruebas
Documentación
Arquitecturas
Algoritmos y Programación III
Carlos Fontela, 2006
Página 33
Muchas Gracias.
Carlos Fontela, 2006