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