Tema 4. Clases de utilidad Arrays Clases String, StringBuffer y StringTokenizer Wrappers Clase Math Entrada/salida de datos Java Collections Framework (JCF) Clases para manejo de fechas y horas 1 Arrays Características Se crean con el operador new seguido del tipo y número de elementos Nº de elementos del array: variable miembro implícita length (Ej: vec.length) Se puede acceder a los elementos de un array con los corchetes [] y un índice que varía de 0 a length-1 Pueden crearse arrays anónimos Creación double []x; x = new double [100]; Referencia a un array double [] x = new double [100]; 2 Ejemplos creación arrays Creación array de 10 enteros, inicializados por defecto a 0 int []v = new int [10]; Creación array inicializado con valores int []v = {0,1,2,3,4,5,6,7,8,9}; String []dias={“lunes”,”martes”,”miercoles”,”jueves”}; Array de 5 objetos MiClase []listaObj=new MiClase[5]; for(i=0;i<5;i++) listaObj[i]=new MiClase(); Array anónimo obj.metodo(new []String = {“uno”,”dos”,”tres”}); 3 Arrays bidimensionales Una matriz es un vector de vectores fila Creación Opción 1: int [][] mat = new int[nifilas][ncols]; Opción 2: int [][] mat; // referencia a matriz // creación del vector de referencias a las filas mat = new int [nfilas][]; // reserva de memoria para las filas for(int i = 0;i<nfilas;i++) mat[i]=new int [ncols]; Creación + inicialización: int [][] mat = {{1,2,3},{4,5,6}}; 4 Clases String y StringBuffer Orientadas a manejar cadenas de caracteres String: manejo de cadenas de caracteres constantes StringBuffer: permite modificar la cadena: inserciones, borrados, ... Más eficiente Más posibilidades Pertenecen al paquete java.lang No hay que importar las clases 5 Clase String Creación: String str1 = “hola”; Métodos: char charAt(int index) Devuelve el carácter de la posición especificada void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Copia caracteres en la posición indicada de un array de caracteres int indexOf(String str, int fromIndex) Devuelve la posición en la que aparece por 1ª vez str a partir de la posición indicada int length() Devuelve la longitud de la cadena String substring(int beginIndex, int endIndex) Devuelve una subcadena 6 Clase StringBuffer (i) Se utiliza cuando se desea modificar una cadena de caracteres Constructores: StringBuffer() Crea un StringBuffer sin caracteres con una capacidad inicial de 16 caracteres StringBuffer(int length) Crea un StringBuffer sin caracteres con una capacidad inicial especificado por el argumento length StringBuffer(String str) Crea un StringBuffer a partir de un String 7 Clase StringBuffer (ii) Métodos: StringBuffer append(...) → Diferentes definiciones para añadir un String o una variable al StringBuffer int capacity() → Devuelve la capacidad del StringBuffer StringBuffer delete(int start, int end) → Elimina los caracteres en una subcadena del StringBuffer StringBuffer insert(int,...) → Inserta un String o un valor en la posición especificada del StringBuffer StringBuffer reverse() → Cambia el orden de los caracteres void setLength(int newLength) → Cambia el tamaño del StringBuffer String toString() → Convierte a String 8 Clase StringTokenizer Permite separar en tokens una cadena. Pertenece al paquete java.lang Ejemplo: StringTokenizer st=new StringTokenizer(cadena); int n = st.countTokens(); String []tokens = new String [n]; for(int i=0;st.hasMoreTokens();i++){ tokens[i]=st.nextToken(); } 9 Wrappers Son clases diseñadas como complemento de los tipos primitivos Wrapper (envoltorio) Los tipos primitivos son los únicos elementos de Java que no son objetos Se pasan por valor → no pueden modificarse Objeto cuya variable miembro es un tipo primitivo Proporcionan métodos para realizar tareas con los tipos primitivos (ej: conversión a cadena de caracteres) Existe una clase Wrapper para cada tipo primitivo numérico: Clases Byte, Short, Integer, Long, Float y Double 10 Clase Double Jerarquía Métodos java.lang.Object ← java.lang.Number ← java.lang.Double Double(double) y Double(String) → Constructores double doubleValue(), float floatValue(), long longValue(), int intValue(), short shortValue() y byte byteValue() → Métodos para obtener el valor del tipo primitivo String toString() y Double valueOf(String) → Conversores con la clase String boolean isInfinite() y boolean isNaN() → Chequeo de condiciones Constantes MAX_VALUE, MIN_VALUE, NaN, NEGATIVE_INFINITE, POSITIVE_INFINITE 11 Clase Integer Jerarquía Métodos java.lang.Object ← java.lang.Number ← java.lang.Integer Integer(int) y Integer(String) → Constructores double doubleValue(), float floatValue(), long longValue(), int intValue(), short shortValue() y byte byteValue() → Métodos para obtener el valor del tipo primitivo String toString() y Integer valueOf(String) → Conversores con la clase String String toBinaryString(int), String toHexString(int), String toOctalString(int) → Conversores a cadenas en distintas bases Constantes MAX_VALUE, MIN_VALUE 12 Ejemplo Wrappers Conversión de cadena a número: String numIntString = "1001"; Opción 1: Opción 2: int numInt = Integer.valueOf(numIntString).intValue(); int numInt = Integer.parseInt(numIntString); Conversión de número a cadena: int numInt=5; String cadena=Integer.toString(numInt) 13 Clase Math Jerarquía: java.lang.Object ← java.lang.Math Proporciona métodos static para realizar operaciones matemáticas double acos(double a), double asin(double a), double atan(double a), double sin(double a), double cos(double a) double exp(double a) double log(double a) double pow(double a,double b) ... Proporciona las constantes E y PI 14 Entrada/Salida de datos (1) Lectura de datos: Escritura de datos: Lectura Escritura abrir un stream Mientras más información leer información cerrar el stream abrir un stream mientras más información escribir información cerrar el stream Paquete java.io: Colección de clases de stream para leer y escribir Están divididas en streams de caracteres y bytes 15 Entrada/Salida de datos (2) Streams de caracteres • Clases para leer y escribir caracteres de 16 bits • Clases que leen o escriben en destinos o fuentes de datos (sombreado) • Clases que realizan algún tipo de procesamiento (resto) 16 Entrada/Salida de datos (3) Streams de bytes • Clases para leer y escribir bytes (8 bits) • Streams de destinos o fuentes (sombreado) • Streams de procesamiento (resto) 17 Entrada/Salida de datos (4) Ejemplo: Copia de un fichero de texto import java.io.*; public class Copiar { public static void main(String[] args) throws IOException { File ficheroEntrada = new File("origen.txt"); File ficheroSalida = new File("destino.txt"); FileReader in = new FileReader(ficheroEntrada); FileWriter out = new FileWriter(ficheroSalida); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } } 18 Java Collections Framework JCF (estructura de colecciones de Java): Conjunto de clases e interfaces para trabajar con colecciones de objetos Introducida en la versión 1.2 del JDK Jerarquía de interfaces Jerarquía de clases 19 Jerarquía de interfaces Collection Map Set List HashSet ArrayList SortedSet TreeSet LinkedList HashMap WeakHashMap Las interfaces determinan HashTable Vector SortedMap Stack TreeMap Comparable Iterator Comparator ListIterator las capacidades de las clases que implementan Ej: Las clases ArrayList y LinkedList implementan la interface List. Disponen de los mismos métodos y se pueden utilizar de la misma forma. La diferencia está en la implementación 20 Jerarquía de clases AbstractCollection AbstractSet HashSet TreeSet AbstractList ArrayList AbstractMap TreeMap HashMap AbstractSequentialList LinkedList WeakHashMap Collections Arrays 9 Collections y Arrays no son abstract, pero no tienen constructores. Contienen métodos para operaciones de ordenación, búsqueda, ... 21 Interfaces de la JCF Collection: Define métodos para tratar una colección genérica de elementos Set: Colección que no admite elementos repetidos SortedSet: Set cuyos elementos se mantienen ordenados según el criterio establecido List: Admite elementos repetidos y mantiene un orden inicial Map: Cjto. pares clave/valor (sin repetición de claves) SortedMap: Map cuyos elementos se mantienen ordenados según el criterio establecido 22 Interfaces de soporte Iterator: Dispone de métodos para recorrer una colección y borrar elementos ListIterator: Permite recorrer listas en ambos sentidos Comparable: Declara el método compareTo() que permite ordenar las colecciones según un orden natural (String,Date, Integer, ...) Comparator: Declara el método compare() y se utiliza en lugar de Comparable cuando se desea ordenar objetos no estándar 23 Clases de propósito general HashSet: Interface Set implementada mediante una hash table (tabla dispersa) TreeSet: Interface SortedSet implementada mediante un árbol binario ordenado ArrayList: Interface List implementada mediante un array LinkedList: Interface List implementada mediante una lista enlazada HashMap: Interface Map implementada mediante una hash table WeakHashMap: Interface Map implementada de modo que la memoria de los pares clave/valor pueda ser liberada cuando las claves no tengan referencia desde el exterior de la WeakHashMap TreeMap: Interface SortedMap implementada mediante un árbol binario 24 Clases adicionales Clases históricas Clase Collections Clases Vector, Stack y HashTable No siguen las reglas de diseño del JCF Se han mantenido por motivos de compatibilidad Dispone métodos static para ordenar, desordenar, invertir el orden, realizar búsquedas, llenar, copiar, hallar el mínimo y hallar el máximo Clase Arrays Contiene métodos static para ordenar, llenar, realizar búsquedas y comparar los arrays clásicos 25 Clases relacionadas con fechas y horas Clase Date Clase Calendar Clase DateFormat Clase GregorianCalendar Clase SimpleDateFormat Clase TimeZone Clase SimpleTimeZone 26 Clase Date Representa un instante de tiempo con precisión de milisegundos (ms) La información se almacena en un entero long de 64 bits que contiene los ms desde las 00:00:00 del 1/1/1970 GMT (Greenwich mean time) Métodos Date() → crea un objeto a partir de la fecha y hora del ordenador Date(long) → crea un objeto a partir de los ms transcurridos desde el 1/1/1970, 00:00:00 GMT boolean after(Date) y boolean before(Date) → indica si la fecha es posterior o anterior a la fecha especificada long getTime() y void setTime(long) → obtiene o establece los ms transcurridos desde el 1/1/1970, 00:00:00 GMT 27 Clases Calendar y GregorianCalendar Clase abstract que dispone de métodos para convertir objetos de la clase Date en enteros que representan fechas y horas La clase GregorianCalendar deriva de Calendar y es la que se utilizará Representación de fechas y horas: Horas: enteros de 0 a 23 Minutos y segundos: enteros entre 0 y 59 Días del mes: enteros entre 1 y 31 Meses del año: enteros de 0 a 11 Años: enteros de 4 dígitos (si se utilizan dos dígitos, se resta 1900) 28 Variables miembro y constantes de Calendar int AM_PM → puede tomar 2 valores: las constantes AM y PM int DAY_OF_WEEK → puede tomar los valores int: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY y SATURDAY int MONTH → puede tomar los valores int: JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER y DECEMBER int HOUR → indica la hora en relojes de 12 horas int HOUR_OF_DAY → indica la hora en relojes de 24 horas Los enteros ERA, YEAR, MINUTE, SECOND, MILLISECOND tienen un significado evidente int ZONE_OFFSET y int DST_OFFSET indican la zona horaria y el desfase de segundos respecto a la zona GMT 29 Métodos de la clase Calendar La clase Calendar dispone de un gran número de métodos para establecer los valores de la fecha y la hora int get(int field) → obtiene el valor del campo especificado void set(...) → establece el valor de los campos especificados void set(int void set(int void set(int void set(int int second) field, int value) year, int month, int date) year, int month, int date, int hour, int minute) year, int month, int date, int hour, int minute, 30 Clase GregorianCalendar Deriva de la clase Calendar Añade las constantes BC (Before Christ) y AD (Anno Domini) para la ERA Constructores GregorianCalendar() → crea un objeto usando la fecha y hora actual en la zona de tiempo por defecto GregorianCalendar(int year, int month, int date) → crea un objeto usando la fecha especificada GregorianCalendar(int year, int month, int date, int hour, int minute) → crea un objeto usando la fecha y hora especificada GregorianCalendar(int year, int month, int date, int hour, int minute, int second) → crea un objeto usando la fecha y hora especificada 31 Ejemplo Date trialTime = new Date(); GregorianCalendar gc = new GregorianCalendar(); gc.setTime(trialTime); System.out.println("ERA: " + gc.get(Calendar.ERA)); System.out.println("YEAR: " + gc.get(Calendar.YEAR)); System.out.println("MONTH: " + gc.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: "+ gc.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: "+ gc.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + gc.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + gc.get(Calendar.DAY_OF_MONTH)); 32 Clases DateFormat y SimpleDateFormat DateFormat: Clase abstract del package java.text (no pertenece a java.util, como las anteriores) Permite dar formato a fechas y horas Dispone de métodos static para convertir Strings representando fechas y horas en objetos de la clase Date, y viceversa SimpleDateFormat: Clase derivada de DateFormat Constructor: SimpleDateFormat(String pattern) El String indica el formato a utilizar 33 Ejemplo public static void main(String arg[]) throws ParseException { SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM-yy"); Date d = sdf1.parse("12-04-1968 11:23:45"); String s = sdf2.format(d); System.out.println(s); } 34 Clases TimeZone y SimpleTimeZone TimeZone: Clase abstract que sirve para definir la zona horaria Pertenece al package java.util public static TimeZone getDefault() → devuelve la zona horaria del ordenador en el que se ejecuta el programa SimpleTimeZone: Deriva de TimeZone Es la que se utiliza 35