Interfaces. Arrays. Colecciones.
Vamos a comenzar de nuevo con un ejercicio sobre el API de Java.
java.util
. Consultando las
páginas HTML que describen el paquete, contesta en el fichero respuestas.txt
las siguientes preguntas:
?Iterator
. Iterator
?java.util
devuelven un Iterator
? (¡No se te ocurra buscarlos uno
a uno!, hay una forma mucho más fácil).Watcher
, Sensor
, Sonar
y Bumper
.
La clase Sensor
es una clase abstracta de la que heredan Sonar
y Bumper
. La clase Sensor
implementa la interfaz
Watcher
. Suponemos que todas estas clases se están definiendo
para implementar un programa Java que simula el movimiento de un robot móvil
en un mapa predefinido. El robot tendrá objetos de tipo Sonar
y Bumper
(y otros) que se usarán para tomar lecturas del
entorno simulado en el que se mueve.package modulo1.sesion4; import plj.geom.*; /** * La interfaz Watcher especifica una posición y una * dirección en la que se mira. Ambos datos están referidos * a un sistema de referencia (mapa) global. */ public interface Watcher { public Position getPos(); public double angle(); }
package modulo1.sesion4; public abstract class Sensor implements Watcher { int state; private long time; public abstract void doReadings(); public int getState() { return state; } public void fire() { time = System.currentTimeMillis(); doReadings(); } public long lastTimeFired() { return time; } }
package modulo1.sesion4; import plj.geom.Position; public class Sonar extends Sensor { double[] readings; int resolution; // numero de lecturas int rangeMax; // maximo alcance double angleMax; // arco del sonar public Sonar(int resolution, int rangeMax, double angleMax){ this.resolution = resolution; this.rangeMax = rangeMax; this.angleMax = angleMax; } public double[] getReadings() { return readings; } /** * doReadings() actualiza el array readings * con todas las lecturas de distancias * de objetos frente al sonar en la direccion * angle() y en un arco y una resolucion definida por * el tipo de sonar */ public void doReadings() { } public Position getPos() { return null; } public double angle() { return 0; } }
package modulo1.sesion4; import plj.geom.Position; public class Bumper extends Sensor { boolean bumped; /** * doReadings() actualiza bumped. * true -> si ha habido un contacto * false -> si el sensor no ha chocado con nada */ public void doReadings() { } public boolean bumped() { return bumped; } public Position getPos() { return null; } public double angle() { return 0; } }
Sensor
?angle()
en la clase Bumper
?¿Por qué?move()
en la interfaz Watcher
?Sensor
como concreta
(no abstracta)? ¿Habría que añadirle algún
método? ¿Habría que quitarle algún método?
¿Podría doReadings()
seguir siendo un método
abstracto?Vamos a hacer un pequeño ejemplo en el que manejemos arrays. También vamos a usar la entrada estándar para introducir valores a un programa Java.
sort
para ordenar
arrays estáticos que se define en la clase java.util.Arrays
.package modulo1.sesion4; import java.util.Arrays; public class ArrayDemo1 { public static void main(String args[]) { int vec[] = { 37, 47, 23, -5, 19, 56 }; Arrays.sort(vec); for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } } }Cambia el tipo de array a un array de
Strings
, inicializa el
array con valores de cadenas arbitrarias y prueba si funciona el programa.
¿Cómo piensas que puede funcionar correctamente, sin añadir
ningún parámetro al método sort()
que le
diga el tipo de elementos que hay en el array? (Contesta en el fichero respuestas.txt).package modulo1.sesion4; import java.util.Arrays; public class ArrayDemo2 { public static void main(String args[]) { int vec[] = {-5, 19, 23, 37, 47, 56}; int slot = Arrays.binarySearch(vec, 35); slot = -(slot + 1); System.out.println("Punto de inserion = " + slot); } }El programa busca en el array el número 35 y no lo encuentra. Por eso el método
binarySearch
devuelve un número negativo.
El número -(slot
+ 1) es el lugar donde se encontraría
el número en el caso de estar en el array. parseDouble()
de la clase
Double
para convertir la cadena que escribe el usuario en un
double
.package modulo1.sesion4; import java.io.*; public class StandardInput { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); for (;;) { System.out.print("StandardInput> "); String line = in.readLine(); // El programa termina cuando llegamos al fin del // fichero o el usuario introduce quit if ((line == null) || line.equals("quit")) break; // Parsea la linea y calcula la raiz cuadrada try { double x = Double.parseDouble(line); System.out.println("raiz cuadrada de " + x + " = " + Math.sqrt(x)); } // Si algo falla muestra un mensaje de error catch (Exception e) { System.out.println("Entrada erronea"); } } } }
ArrayDemo3.java
que pida al usuario números enteros hasta
que escriba la cadena "fin", introduzca los números en un
array y después pida al usuario un número a buscar en el array.
El programa debe terminar dando un mensaje que diga en qué posición
se encuentra el número o el mensaje "número no encontrado"
si el número no está en el array.Vamos a ver un pequeño ejemplo que use el framework Collections. En el apartado 1.7 de los apuntes hay una explicación detallada de las clases e interfaces de este framework. El uso de interfaces es muy importante en las colecciones.
package modulo1.sesion4; import java.util.*; public class CollectionDemo1 { public static void main(String args[]) { // Creo una coleccion de objetos List list = new ArrayList(); // Anyado elementos a la colección list.add("This is a String"); list.add(new Short((short) 12)); list.add(new Integer(35)); // Obtengo un iterador de la lista y lo recorro for (Iterator i = list.iterator(); i.hasNext();) { System.out.print(i.next()); } } }Contesta las siguientes preguntas en el fichero respuestas.txt.
List
, una clase abstracta o un interfaz?
¿Sería correcto hacer la siguiente llamada?
List miLista = new List();
ArrayList()
por new LinkedList()
?¿Qué cambiaría?public void metodoQueUsaList(List unaLista)
TreeSet
, que implementa la interfaz SortedSet
.
Prueba el siguiente ejemplo:
package modulo1.sesion4; import java.util.*; public class CollectionDemo2 { public static void main(String args[]) { // Creo una coleccion de objetos List list = new ArrayList(); // Anyado elementos a la colección list.add(new Integer(50)); list.add(new Integer(-1)); list.add(new Integer(35)); // Creo un TreeSet a partir de la lista TreeSet set = new TreeSet(list); // Anyado otros elementos al conjunto set.add(new Integer(99)); set.add(new Integer(-5)); // Obtengo un iterador del conjunto y lo recorro for (Iterator i = set.iterator(); i.hasNext();) { System.out.print(i.next()+" "); } } }
CollectionDemo3
que pida al usuario números enteros hasta
que escriba la cadena "fin", introduzca los números en un
conjunto y después pida al usuario un número a buscar en el
conjunto. El programa debe terminar dando un mensaje que diga si el número
introducido está en el conjunto o no. PARA ENTREGAR
Debes crear un ZIP llamado sesion4.zip con: