2.1.Trabajando con wrappers
Utiliza la clase sesion02.Ej1 que se proporciona en la plantilla para construir un programa que tome como parámetro (en el main) dos valores reales (doubles), y muestre por pantalla el producto del primero y el segundo.
AYUDAS: utiliza la clase Double, y mira entre sus métodos cuáles pueden servirte para convertir los parámetros a números reales.
2.2.Aprovechando los elementos de Object
Echa un vistazo a la clase sesion02.Ej2 de la plantilla. Verás que hay una clase interna llamada MiObject que contiene un valor entero y una cadena. Tiene un constructor para poder asignar valor a cada campo. Después, desde la clase principal Ej2 se crean varios objetos de este tipo, cada uno con un valor entero y una cadena. Después se utiliza el método equals para compararlos entre sí, e indicar si son iguales o no. Finalmente, se imprime por pantalla cada uno de los objetos creados.
Asumimos que dos objetos de tipo MiObject son iguales si sus campos enteros son iguales, y si sus cadenas también son iguales. Teniendo en cuenta todo esto:
Probablemente habrás descubierto que las comparaciones no funcionan del todo bien: m1 y m2 son aparentemente iguales, y sin embargo dice que son diferentes. También habrás visto que a la hora de imprimir el objeto saca una ristra de caracteres que no se entienden. Vamos a corregir todo esto por separado.
public boolean equals(Object o) { ... }y rellénalo de forma adecuada para que devuelva true si el objeto o es igual al actual (this), es decir, si tiene su campo entero y su campo cadena igual al actual.
AYUDA: observa que tendrás que convertir el objeto o a tipo MiObject para poder comparar. El método equals exige que el objeto que se le pasa como parámetro sea SIEMPRE de tipo Object, para poder hacer bien la herencia y sobreescritura del método equals original. Después, en el código, deberemos convertir este objeto al tipo concreto con que trabajemos:
MiObject mo = (MiObject) o;
public String toString() { ... }y haz que devuelva una cadena conteniendo el número entero, una coma, y la cadena del objeto MiObject.
2.3.Recorrido de vectores y listas
La clase sesion02.Ej3 de la plantilla tiene un método main, donde hemos creado un objeto de tipo Vector, y le hemos añadido 10 cadenas: Hola0, Hola1, Hola2...Hola9. Con este vector deberás hacer lo siguiente:
Enumeration elements();que devuelve un Enumeration para poder recorrer los elementos del vector. Se trata de que obtengas esa enumeración, y formes un bucle como se ha explicado en los apuntes, para recorrerla de principio a fin. Para cada elemento, saca su valor por pantalla (imprime la cadena).
Iterator iterator();que devuelve un Iterator para poder recorrer los elementos del vector. Haz ahora otro bucle como el que se explica en los apuntes, para recorrer los elementos del vector, esta vez con el Iterator. Para cada elemento, vuelve a imprimir su valor por pantalla.
Una vez tengas los tres bucles hechos, ejecuta el programa, y observa lo que saca cada uno de los bucles por pantalla. ¿Encuentras alguna diferencia en el comportamiento de cada uno? ¿Qué forma de recorrer el vector te resulta más cómoda de programar y por qué?
NOTA: algunas de las técnicas que has utilizado para recorrer el vector se pueden utilizar de la misma forma para recorrer otros tipos de listas. Por ejemplo, puedes obtener el Iterator de un ArrayList y recorrerlo, o ir elemento por elemento...
2.4.Ventajas de los mapas
Trabajar con mapas es la forma más eficiente y cómoda de almacenar pares clave=valor. La clase sesion02.Ej4 contiene una subclase llamada Parametro, que utilizamos para guardar ciertos parámetros de configuración, y sus valores. Verás que esta clase tiene un campo nombre donde pondremos el nombre del parámetro, y otro valor con su valor.
La clase principal Ej4 crea muchos parámetros de este tipo, y los almacena en un ArrayList. Finalmente, busca en dicho ArrayList el valor del parámetro cuya clave se le pasa en el main. Saca un mensaje indicando en qué posición lo encontró, y luego imprime todos los Parametros por pantalla, sacando su nombre y su valor.
ArrayList al = new ArrayList(); ... al.add(new Parametro("Clave1", "Valor1"));ahora harás:
Hashtable ht = new Hashtable(); ... ht.put("Clave1", "Valor1");
String valor = (String)(ht.get(nombre)); if (valor == null) ... else ...En este caso no hace falta que indiques en qué posición encontraste al elemento, puesto que, como verás después, las tablas hash no mantienen las posiciones como te esperas.
Enumeration keys();
te devuelve una enumeración de las claves. Luego utilízala para recorrerlas, y con cada una sacar su valor e imprimirlo:
Enumeration en = ht.keys(); while (en.hasMoreElements()) { String clave = (String)(en.nextElement()); String valor = (String)(ht.get(clave)); ... // Imprimir clave y valor por pantalla }
2.5. Ordenar tus propios datos
La clase datos.Persona de la plantilla almacena los datos generales de una persona, como son su nombre, primer apellido, segundo apellido, dirección y teléfono. Tiene un constructor que se encarga de asignar todos esos campos, y métodos get y set para obtener sus valores o cambiarlos, respectivamente.
Además, al final tiene un método main que crea varios objetos de tipo Persona, los coloca en un ArrayList, y luego intenta ordenarlos llamando al método Collections.sort. Sin embargo, de momento el método no funciona (probablemente salte una excepción, porque no sabe cómo comparar los elementos de la lista).
Haz las modificaciones necesarias en la clase para que el método ordene correctamente. Queremos que se siga el siguiente criterio de ordenación:
Comprueba, una vez lo tengas hecho, que la secuencia que saca el programa tras ordenar es la correcta:
Elemento 1: "Bravo Murillo, Manuel, C/La Huerta - 22, 965123456" Elemento 2: "García Hernández, Marta, C/Aloma - 22, 634253456" Elemento 3: "García Hernández, Rafael, C/Aloma - 1, 601123546" Elemento 4: "García Rodríguez, Carolina, Avda. Doctor Rico - 25, 661228844" Elemento 5: "Simón Mas, Eva, Camino del Prado - 30, 966124627"
Imagina que queremos cambiar el criterio de ordenación, y ahora queremos ordenar de mayor a menor por el nombre. ¿Qué cambios tendríamos que hacer? No los hagas, simplemente déjalos indicados en la respuesta a esta pregunta.