Sesión 4

Interfaces. Arrays. Colecciones.

1. El API de Java (cont.)

Vamos a comenzar de nuevo con un ejercicio sobre el API de Java.

  1. Busca en el API de Java el paquete java.util. Consultando las páginas HTML que describen el paquete, contesta en el fichero respuestas.txt las siguientes preguntas:
  2. Busca en el paquete la interfaz Iterator.

2. Un ejemplo de interfaces

  1. Descomprime el fichero de plantillas del ejercicio. Encontrarás las clases 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;
        }
    }
  2. Compíla las clases. Contesta a las siguientes preguntas en el fichero respuestas.txt:
  3. Escribe un programa de ejemplo que use esas clases.

2. Implementando interfaces

  1. Define e implementa un ejemplo de interfaz y de clase o clases que lo implementen. Recuerda algunas reglas básicas sobre clases e interfaces:

3. Arrays

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.

  1. Prueba el siguiente programa. Es un programa que define un array estático y después lo ordena. Usa el método 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).
  2. Prueba el siguiente programa, que realiza una búsqueda binaria en un array
    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.
  3. Prueba el siguiente programa, que muestra cómo pedir datos al usuario usando la entrada estándar. El programa espera números doubles y usa el método estático parseDouble() de la clase Double para convertir la cadena que escribe el usuario en un double.
  4. 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");
                }
            }
        }
    }
  5. Termina juntando todos los programas de este punto: escribe un programa 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.

4. ArrayLists

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.

  1. Compila y prueba el siguiente programa:
    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.
  2. Si necesitas que la colección de elementos esté ordenada, debes usar la clase 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()+" ");
            }
        }
    }
  3. Por último, de forma similar al ejercicio anterior, escribe un programa 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.
    Nota 1: usa el API de la interfaz SortedSet para encontrar los métodos con los que comprobar si el número está en el conjunto.
    Nota 2: nota que en las colecciones deben introducirse objetos y no datos primitivos. Lee el apartado 1.7.3 de los apuntes si quieres más información sobre los wrappers de los tipos básicos.

PARA ENTREGAR

Debes crear un ZIP llamado sesion4.zip con: