Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Corina Flores V. Programa MEMI
Por Corina Flores Villarroel [email protected]
UMSS - Programa MEMI
AGRUPANDO OBJETOS (Parte-III)
Corina Flores V. Programa MEMI
Contenido Conceptos a saber:
String ArrayList Random HashMap HashSet Iterator Arrays
Corina Flores V. Programa MEMI
Introducción A través de este capítulo conoceremos
nuevas bibliotecas de clases que Java ofrece.
Entre ellas, aquella que genera números randómicos, hash maps, sets y string.
Corina Flores V. Programa MEMI
Documentación para bibliotecas de clases La biblioteca (librería) de Java es grande.
Consiste de miles de clases, cada una conteniendo muchos métodos con y sin parámetros, con y sin tipos de retorno. Lo que hace imposible de memorizarlo todo.
Sin embargo, es importante conocer cómo explorar y entender esta biblioteca.
Corina Flores V. Programa MEMI
Documentación para bibliotecas de clases Afortunadamente, la biblioteca de java esta
bien documentada. Esta documentación esta disponible en formato HTML posible de ver con el uso de un navegador.
Leer y entender esta documentación será una de las tareas que aprenderemos en este capítulo.
Corina Flores V. Programa MEMI
Documentación para bibliotecas de clases Así aprenderemos a:
Conocer el nombre de las clases El nombre de los métodos Los parámetros y tipos de retorno de los métodos Y, exactamente qué hacen estos métodos.
Corina Flores V. Programa MEMI
JavaDocs Javadoc es un standard industrial para documentar clases de
Java ** * A class to maintain an arbitrarily long list of notes. * Notes are numbered for external reference by a human user. * In this version, note numbers start at 0. * * @author David J. Barnes and Michael Kolling. * @version 2006.03.30 */ public class Notebook { // Storage for an arbitrary number of notes. private ArrayList<String> notes;
/** * Perform any initialization that is required for the * notebook. */ public Notebook() {
Corina Flores V. Programa MEMI
¿Para qué documentar? Para hacer más comprensible el código fuente a otros
programadores que tengan que trabajar con él, ya sea porque forman parte del grupo de desarrollo.
Para facilitar que el programa puede ser mantenido o modificado por otra persona distinta al programador inicial.
También resulta muy útil durante la depuración y el mantenimiento del programa por el propio programador, al paso del tiempo las decisiones se olvidan y surgen dudas hasta en el propio programador.
Corina Flores V. Programa MEMI
¿Qué documentar? Las clases Variables Métodos Y todo aquello que se considere importante
Corina Flores V. Programa MEMI
¿Qué documentar? Al documentar debemos explicar por qué se hace así una
clase, un método, etc. Esto se traduce en: ¿de qué se encarga una clase? ¿un paquete? ¿qué hace un método? ¿cuál es el uso esperado de un método? ¿para qué se usa una variable? ¿cuál es el uso esperado de una variable? ¿qué algoritmo estamos usando? ¿de dónde lo hemos
sacado? ¿qué limitaciones tiene el algoritmo? ¿... la implementación? ¿qué se debería mejorar ... si hubiera tiempo?
Corina Flores V. Programa MEMI
Generar documentación con BlueJ BlueJ puede ayudar en la documentación de clases Para usar una clase, lo único que se necesita conocer
de ella es la interfaz pública:
• campos: sus nombres y tipos, y descripción • métodos: sus cabeceras y descripción de lo que hacen
Se puede extraer esta información de manera automática, por medio de herramientas de documentación.
Elegir en la ventana del proyecto: Tools => Project documentation
Corina Flores V. Programa MEMI
Generar documentación con BlueJ
Corina Flores V. Programa MEMI
Generar documentación con BlueJ
Corina Flores V. Programa MEMI
Documentación de Java
Corina Flores V. Programa MEMI
El sistema de soporte técnico Este ejemplo, trata de un programa que provee el
soporte técnico a clientes de una compañía de software. Esta compañía tiene un departamento que se encarga de dar el soporte técnico a través de llamadas de clientes quienes piden ayuda con sus problemas técnicos.
El programa establece un diálogo con el usuario a través del envío de mensajes respuestas a las consultas que el cliente le hace.
Corina Flores V. Programa MEMI
El sistema de soporte técnico Para ingresar las consultas del usuario, el programa
debe permitir escribir texto a través del teclado.
Cómo hacerlo?, utilizando la clase Scanner del paquete util de Java
Corina Flores V. Programa MEMI
El sistema de soporte técnico Veamos el modelo del ejemplo del proyecto
SoporteTecnico
Corina Flores V. Programa MEMI
El sistema de soporte técnico public class SistemaSoporte { private InputReader lee; private Responder responde;
/** * Crea al sistema de soporte. */ public SistemaSoporte() { lee = new InputReader(); responde = new Responder(); }
Corina Flores V. Programa MEMI
El sistema de soporte técnico Examinemos las clases participantes
InputReader, permite obtener una cadena entrada desde afuera (terminal)
Responder, genera una respuesta
Corina Flores V. Programa MEMI
El sistema de soporte técnico A su vez:
InputReader, tiene un método getInput que permite ingresar una línea de entrada desde afuera.
String entrada = lee.getInput();
public String getInput() { System.out.print("> "); // muestra el prompt String escribeLinea = lector.nextLine();
return escribeLinea; }
Corina Flores V. Programa MEMI
El sistema de soporte técnico Responder, tiene un método generaRespuesta que
permite siempre retornar una cadena .
String respuesta= responde.generaRespuesta();
public String generaRespuesta() { return "Hemos tomado nota de su problema. Algo más?..."; }
Corina Flores V. Programa MEMI
El sistema de soporte técnico Veamos con atención el método comenzar()
public void comenzar() { boolean finalizado = false;
imprimeBienvenida();
while(!finalizado) { String entrada = lee.getInput(); … }
imprimeDespedida();
}
Corina Flores V. Programa MEMI
private void imprimeBienvenida() { System.out.println("Bienvenid@ al sistema de soporte tecnico de VIVA."); System.out.println(); System.out.println("Por favor, cuéntenos ... ¿cúal es su problema?."); System.out.println("Nosotros le ayudaremos cualquiera que sea éste."); System.out.println("Para terminar nuestro diálogo, por favor escriba ... 'chau', gracias!"); }
El sistema de soporte técnico El método imprimeBienvenida()
Corina Flores V. Programa MEMI
El sistema de soporte técnico Volviendo al método start(), encontramos al método
startsWith()
while(!finalizado) { String entrada = lee.getInput();
if(entrada.startsWith("chau")) { finalizado = true; } else {
Testea si la cadena de entrada comienza con La palabra ‘chau’
Corina Flores V. Programa MEMI
Leyendo la documentación de clases Desde el menú Tools de BlueJ, seleccionar la
opción Use Library Class …
Este abrirá un browser (navegador) que mostrará la página principal que documenta las API de Java.
Corina Flores V. Programa MEMI
Leyendo la documentación de clases Así como:
Nombre de la clase
Descripción de la clase
Corina Flores V. Programa MEMI
Leyendo la documentación de clases Así como:
Constructores y métodos de la clase
Corina Flores V. Programa MEMI
Interfaces vs. Implementación Sintetizando, la documentación incluye diferentes piezas de
información. Entre ellas se pueden citar: El nombre de la clase Una descripción general del propósito de la clase Una lista de constructores y métodos de la clase Los parámetros y tipos de retorno para cada constructor y
métodos Una descripción del propósito de cada constructor y método.
A toda esta información se denomina Interface de una clase.La, Interface describe la visibilidad pública de una clase
Corina Flores V. Programa MEMI
Interfaces vs. Implementación El código fuente, llega a ser la escena donde las clases
trabajan, a esto se llama Implementación de una clase
Comúmente los programadores trabajan de manera simultáneamente en la implementación de grandes programas y en la interface para hacer uso de las clases que necesita.
Corina Flores V. Programa MEMI
Usando métodos de la librería de clases Volviendo al ej. SoporteTecnico … deseamos
mejorar el procesamiento de la cadena ingresada.
Por ejemplo: ¿qué pasa si el usuario ingresa
‘Chau’ en vez de ‘ chau’
Desearíamos ajustar el texto de entrada. Es decir, crear una nueva cadena a partir de ésta.
// Comienza con mayúscula // Comienza con un espacio
Corina Flores V. Programa MEMI
Usando métodos trim() y toLowerCase() Abrir el proyecto SoporteTecnico2 y veamos el
método comenzar()
while(!finalizado) { String entrada = lee.getInput().trim().toLowerCase();
if(entrada.startsWith("chau")) { finalizado = true; }
Corina Flores V. Programa MEMI
Usando métodos trim() y toLowerCase() El método trim(), elimina los espacios de la
cadena ingresada. Por ejem. entrada = entrada.trim(); // almacena en input
una cadena sin espacios. Insertando en nuestro código fuente de
SistemaSoporte1, tendríamos algo como sigue: String entrada = lee.getInput(); entrada = entrada.trim();
Estas dos líneas pueden ser escritas también como: String entrada = lee.getInput().trim()
Corina Flores V. Programa MEMI
Usando métodos trim() y toLowerCase() El método toLowerCase(), convierte la cadena
ingresada a minúsculas. Por ejemplo:
String entrada = lee.getInput().trim().toLowerCase();
Obtiene una cadena
Elimina los espacios de la cadena
Convierte a minúsculas la cadena
Corina Flores V. Programa MEMI
Chequeando la igualdad de cadenas Una forma de intentar chequear si la cadena de
entrada es “chau” en vez de preguntar si comienza con “chau” se podría escribir …
If (entrada == “chau”) { … }
El operador == chequea si cada lado de los operando refieren al mismo objeto, no si ellos tienen el mismo valor
Esto es incorrecto!!
Corina Flores V. Programa MEMI
Chequeando la igualdad de cadenas Una solución es utilizando el método equals, que
permite verificar si el valor de dos objetos cadenas es el mismo. Así:
If (entrada.equals(“chau”)) { … }
Corina Flores V. Programa MEMI
Añadiendo comportamiento randómico Un problema en el proyecto SoporteTecnico1 es que,
siempre da la misma respuesta, independiente de la cadena que ingresa el usuario.
Podríamos mejorar este problema, incluyendo un conjunto de frases con los cuales responder.
El programa, seleccionaría aleatoriamente (randómicamente) una frase para responder.
Usaremos un arrayList para almacenar alguna cadena de respuesta, generaremos un número entero aleatoriamente, y utilizaremos este número como índice de la lista de frases como respuestas.
Corina Flores V. Programa MEMI
La clase random La librería de clases de Java, contiene una clase
Random que ayuda en la generación números aleatorios (randómicos).
Para generar un número randómico, tenemos que: Crear una instancia de la clase Random, y Hacer una llamada a un método de la instancia para
conseguir el número.
Corina Flores V. Programa MEMI
La clase random Así en el proyecto SoporteTecnico2 …
encontramos en la clase Responder
import java.util.ArrayList; import java.util.Random;
public class Responder { private Random randomGenerator; private ArrayList<String> respuestas;
Corina Flores V. Programa MEMI
La clase random Así en el proyecto SoporteTecnico2 …
encontramos en la clase Responder y su constructor …
public Responder() { randomGenerator = new Random(); respuestas = new ArrayList<String>(); llenarRespuestas(); }
Corina Flores V. Programa MEMI
La clase random Así en el proyecto SoporteTecnico2 …
encontramos en la clase Responder Elige un número randómico para el índice de la lista de respuestas. El número estará entre 0 y el tamaño -1 de la lista
public String generateResponse() { int indice = randomGenerator.nextInt(respuestas.size()); return respuestas.get(indice); }
2 1 3
4 5
Corina Flores V. Programa MEMI
La clase random
2
1
3
4
5
Consigue el tamaño de la lista de frases, llamando al Método size. Genera un número randómico entre 0 y el tamaño - 1
Almacena el número randómico en la variable local indice Recupera la respuesta en la posicion del indice con El metodo get.
Retorna la frase resultante.
Corina Flores V. Programa MEMI
Números randómicos con rango limitado Los números randómicos se generan en rango
limitado de enteros (-2147483648 a 2147483647).
El método nextInt(int n) de la clase Random, por ejemplo, genera un número randómico entre 0 y n-1
Corina Flores V. Programa MEMI
Generando respuestas randómicas Podemos extender la clase Responder para
seleccionar una respuesta a partir de una lista predefinida de frases.
Así: import java.util.ArrayList; import java.util.Random;
public class Responder { private Random randomGenerator; private ArrayList<String> respuestas;
Corina Flores V. Programa MEMI
Generando respuestas randómicas En el constructor …
public Responder() { randomGenerator = new Random(); respuestas = new ArrayList<String>(); llenarRespuestas(); }
Corina Flores V. Programa MEMI
Generando respuestas randómicas El método llenarRespuestas() …
private void llenarRespuestas() { respuestas.add("No estamos seguros de comprender su problema. Por favor, describanos mas detalles ..."); respuestas.add("Es un problema de conexion, es importante que revise si el moden esta encendido. \n" + "Podría indicarnos si la luz derecha esta encendida?"); respuestas.add("Muy bien!!. Puede hacer ahora la prueba?..."); respuestas.add("Necesito saber su número de IP, dejeme buscar."); respuestas.add("Ok, tenemos apuntado su reclamo, de inmediato verificaremos el problema"); respuestas.add("Podría por favor indicarnos el modelo de su máquina?. Qué sistema operativo maneja?"); respuestas.add("El problema que nos indica es raro. Nunca hemos tenido una queja así\n" + "pero ... permítanos consultar con el experto?"); respuestas.add("Aguardemé un momento por favor, ... en este instante le paso con el experto!"); respuestas.add("Podría dejar su número telefónico, para devolverle la llamada?. Gracias!"); }
Corina Flores V. Programa MEMI
Generando respuestas randómicas
Se pide hacer abrir el proyecto SoporteTecnico2, examinar su codigo y ejecutar.
Corina Flores V. Programa MEMI
Clases parametrizables o genericas
Son modelos de clases o tambien vistos como contenedores.
Una clase parametrizable es una clase que es usada para crear una familia de otras clases.
Una clase parametrizable no puede ser utilizada tal cual. Conviene primero instanciarla, a fin de obtener una clase concreta que podrá a su vez ser instanciada en objetos.
Corina Flores V. Programa MEMI
Clases parametrizadas Ejemplo:
ArrayList<E> HashMap<K, V>
Informacion extra
E, K, V son nombres de clases, los que a su vez deben ser instanciados.
Clases parametrizadas
o
Clases genericas
Corina Flores V. Programa MEMI
Clases parametrizadas Por ejemplo:
private ArrayList<String> citas; private ArrayList<Producto> productos;
Un ArrayList se puede parametrizar con cualquier otro tipo de clase.
El tipo de objetos puede añadirse a un ArrayList, depende del tipo usado en la parametrizacion, y el tipo de objetos que retorna el metodo get depende tambien del tipo
Corina Flores V. Programa MEMI
Uso de la clase Map
En Java existe una clase denominada Map que al igual que un ArrayList es una coleccion que almacena un par de entradas (objetos) definidas por: CLAVE y VALOR.
La idea es que mediante una CLAVE, se puede conseguir un VALOR.
HashMap es una especializacion de Map
Corina Flores V. Programa MEMI
Uso de la clase Map … Una diferencia entre ArrayList y Map es que con Map cada entrada
no es un objeto, sino un par de objetos.
El par consiste de: Una clave de objeto Un valor de objeto
La biblioteca estándar de Java tiene dos tipos diferentes de objetos Map (que es una interfaz con cierta funcionalidad): HashMap y TreeMap.
Los Maps como los ArrayList pueden expandirse fácilmente.
Corina Flores V. Programa MEMI
Uso de maps … Un ejemplo de Map, puede ser un directorio telefonico,
donde cada entrada consta de un par: Un nombre Un numero telefono
Un Map puede ser organizado por el valor de su clave facilmente. Para el caso del directorio telefonico, este puede ser usando un orden alfabetico, para esto bastara ordenar las claves en orden alfabetico.
Los Maps son utiles, cuando se conoce la clave y se necesita conocer el valor asociado a esta clave.
Corina Flores V. Programa MEMI
Usando un HasMap HashMap es una particular implementacion de Map. Es una colección de
objetos, (como los Arrays), pero estos no tienen posicion. Cada objeto se identifica mediante algun indentificador apropiado, por ejemplo una ”clave". Es decir, para cada objeto que se inserte debe existir una clave única.
Los métodos mas importantes de HashMap son: put get
El metodo put, inserta una entrada en el map, El metodo get, recupera el valor para una clave dada.
El siguiente fragmento de codigo, crea un HashMap e inserta tres entradas en el.
Corina Flores V. Programa MEMI
Usando un HasMap Hashmap<String, String> phoneBook . . . phoneBook = new HashMap<String, String>()
. . .
phoneBook.put(“Armando Manzanero”, “77123456”); phoneBook.put(“Luisa Molina”, “4234561”); phoneBook.put(“William Lopez”, “717345226”);
// Declarando una variable de tipo HashMap
// Creando un objeto HashMap
// Almacenamos las claves y los valores del map
Corina Flores V. Programa MEMI
Usando un HasMap Por ejemplo: deseamos encontrar el numero de telefono
de Luisa Molina y luego imprimir. Entonces, String number = phoneBook.get(“Luisa Molina”); System.out.println(number);
Se puede ver que, se pasa la clave (“Luisa Molina”) para conseguir el valor (numero telefonico)
Corina Flores V. Programa MEMI
Usando un Map en el SoporteTecnico Para el ejemplo del sistema de soporte técnico se puede usar
un Map, de manera que las palabras sean claves que estarán asociadas a valores de respuestas.
Por ejemplo: la palabra lento, estará asociada al siguiente texto: "Posiblemente Ud. tiene muchas aplicaciones abiertas al mismo
tiempo \n" + "Le aconsejo que cierre algunas. Teniendo el cuidado de guardar
sus datos \n" + "luego reinicie su sistema");
Corina Flores V. Programa MEMI
Usando un Map en el SoporteTecnico… Abriendo el proyecto SoporteTecnicoCompleto y
examinando la clase Responder se encuentra …
import java.util.HashMap; . . . private HashMap<String, String> respuestaMap;
public Responder() { respuestaMap = new HashMap<String, String>(); llenarRespuestasMap(); . . . }
// Importando el paquete util
// Declarando
// Creando
Corina Flores V. Programa MEMI
Usando un Map en el Soporte Técnico… Examinando el método llenarRespuestasMap() …
private void llenarRespuestasMap() { respuestaMap.put("lento", "Posiblemente Ud. tiene muchas aplicaciones abiertas al mismo tiempo \n" + "Le aconsejo que cierre algunas. Teniendo el cuidado de guardar sus datos \n" + "luego reinicie su sistema");
respuestaMap.put("virus", "Indiqueme que tipo de mensaje le sale en su pantalla. Sospecho que es un virus\n" + "por tanto, antes de indicarle que hacer conviene saber de que virus se trata\n" + "espero su respuesta");
}
CLAVE
VALOR
Corina Flores V. Programa MEMI
¿Cuándo usar ArrayList o Map? Ambas estructuras (ArrayList y Map) de datos almacenan Objetos y
por defecto en Java todas las clases heredan de Object, lo que permite, guardar cualquier objeto en cada una de ellas.
El asunto es ¿cuándo emplear una u otra estructura?. Por ejemplo, se puede usar un ArrayList cuando se necesita que los objetos almacenados se ordenen de acuerdo a un indice, mantengan el orden en el que se ingresan y pueden tener elementos duplicados. Asi, un ArrayList es una columna de objetos en línea, donde cada objeto ocupa una posicion definida por un indice. En cambio, un HashMap es algo así como una sala llena de objetos dispersos y para llamar a un objeto debemos hacerlo por su clave de modo que retorne su valor asociado. No almacena elementos duplicados.
Corina Flores V. Programa MEMI
Usando sets Un set, es una colección que almacena cada elemento a lo
sumo una vez.
Cada elemento que se añada a un Set debe ser único, ya que el otro caso no se añadirá porque el Set no permite almacenar elementos duplicados.
No mantiene un orden espec’ifico, ya que al aplicar el Iterator los elementos pueden ser retornados en un orden diferente en el que han sido almacenados los objetos que contiene el HashSet
Corina Flores V. Programa MEMI
Usando sets HashSet, es una particular implementación de Set y es utilizado
de forma similar a HashMap.
Por ejemplo:
public void comenzar() { boolean finalizado = false;
imprimeBienvenida();
while(!finalizado) { HashSet<String> entrada = lee.getInput();
if . . . }
Copia las palabras Ingresadas en un HashSet
Corina Flores V. Programa MEMI
Usando sets Veamos el método generaRespuesta …
public String generaRespuesta(HashSet<String> palabras) { Iterator<String> it = palabras.iterator(); while(it.hasNext()) { String palabra = it.next(); String respuesta = respuestaMap.get(palabra); if(respuesta != null) { return respuesta; } } return saltaDefaultResppuesta(); }
Acepta un conjunto de palabras como parámetro
Itera sobre estas pala bras, chequeando con cada una, en su map de palabras. Si cualquiera de
Las palabras es reco nocida, devuelve la Respuesta asociada
Si las palabras no son reco nocidas, devuelve cualquier Respuesta por defecto