Você está na página 1de 12

Java: Algunas utilidades

Inicio
2
Temporizacin
En ingeniera nos encontramos con tareas que deben repetirse de
forma peridica. Son tareas temporizadas
Debemos distinguir:
Tarea temporizada (por ejemplo la lectura o escritura de un archivo,
el mostrar algo por pantalla, accionar un brazo robot, etc.). Tenemos
que crear una clase que hereda de la clase abstracta TimerTask, que
tiene como mtodo abstracto run()
El temporizador: controla el tiempo y ejecuta la tarea temporizada. Es
un objeto de la clase Timer
Para implementarlo:
1. Creamos un objeto que representar la tarea temporizada, la clase
hereda de TimerTask
1. TareaTemporizada tarea = new TareaTemporizada();
2. Iniciamos el temporizador:
Timer t = new Timer();
t.schedule( tarea, inicio, periodo );
- inicio: cuando se inicia en ms
- periodo: perodo de tiempo en ms
3. El temporizador llamar peridicamente al mtodo run() de la tarea
temporizada

Inicio
3
Un ejemplo
La clase que representa la tarea temporizada, muestra un mensaje con la fecha y hora:
package figuras.prueba;
import java.util.TimerTask;
import java.util.Calendar;

public class TareaPeriodica extends TimerTask {
public void run() {
Calendar cal = Calendar.getInstance();
System.out.println( "Buenas, saludo repetitivo a las " + cal.getTime());
}
}
En main() temporizamos y, mientras el usuario no presione Enter, no cancelamos:
public static void main(String[] args) {

String opcion ="a";
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

figuras.prueba.TareaPeriodica tarea = new figuras.prueba.TareaPeriodica();
Timer timer = new Timer();
timer.schedule( tarea, 0, 15*1000 );

while (opcion.length() != 0) {
try {
opcion = entrada.readLine();
}
catch (Exception e) { e.printStackTrace(); }
}
timer.cancel();
}
Inicio
4
Un ejercicio
Volvamos a nuestro ejemplo de las figuras, que hemos
visto en captulos anteriores. Vamos a hacer una tarea
temporizada que en su constructor arranque el Timer.
El mtodo run() de la tarea lee el archivo de figuras y
las muestra por pantalla
Desde main la nica lnea de cdigo sera:
TareaTemporizada temporizacion = new TareaTemporizada( 0, 60*1000, 5,
"c:/DOC/Java_libre/Figuras/archivos/ejemplo.txt");
Argumentos:
Primero: tiempo hasta inicio
Segundo: periodo
Tercero: nmero mximo de ejecuciones de run(). Si llega al
mximo, entonces se cancela la temporizacin
Cuarto: archivo de figuras
Inicio
5
Ordenando con Comparator
A menudo nos planteamos la ordenacin de elementos de una lista. El problema es que los tipos o clases
de datos son muy diversos y, por tanto, las formas de comparar personas, caballos o coches pueden ser
muy diferentes. Supongamos que tenemos la siguiente clase, que tiene un atributo identificador:
package j13_collection;
public class Ente {
private int id; // Identificativo del elemento
public Ente( int id ) {
this.id = id;
}
public int getId() { return id; }
}
Necesitamos comparar los objetos de menor a mayor en funcin de su id. Para ello vamos a crear la
clase Comparador, que implementa el interfaz Comparator. Lo nico que tenemos que hacer es
sobreescribir el mtodo compare(), que recibir dos entes en la forma de Object. Este mtodo debe
devolver un int negativo si el primer objeto es menor, positivo si es mayor y cero si son iguales:
import java.util.Comparator;
public class Comparador implements Comparator {
public int compare( Object o1, Object o2 ) {
if ( ((Ente)o1).getId() < ((Ente)o2).GetId() )
return 1;
if ( ((Ente)o1).getId() > ((Ente)o1).getId() )
return 1;
return 0;
}
}
Inicio
6
Ordenando un ArrayList
Tomemos el ejemplo anterior y vamos a ordenar un ArrayList:
package j13_collection;
import java.util.*;

public class j13_collection {
public static void main(String[] args) {
List lista = new ArrayList( 2 ); // Creo lista con capacidad de 2
lista.add(new Ente(23)); // Aado ente
lista.add(new Ente(12)); // Aado ente
mostrarLista( (ArrayList) lista ); // Muestra la lista
lista.remove( 0 ); // Borro el primer elemento
mostrarLista( (ArrayList) lista ); // Muestro lista
lista.add(new Ente(9)); // Aado ente
lista.add(new Ente(34)); // Aado ente
mostrarLista( (ArrayList) lista ); // Muestro lista
/* INTERESANTE: llamo al mtodo static sort() de la clase Collections, le paso como primer arg
la lista y como segundo arg un objeto comparador (ver comparador.java) */
Collections.sort( lista, new comparador() );
mostrarLista( (ArrayList) lista ); // Muestra la lista ordenada
}
public static void mostrarLista( ArrayList lista ) {
System.out.println( "ENTIDADES. TAMAO: " + lista.size());
for ( int i = 0; i < lista.size(); i++) {
Ente e = (Ente) lista.get(i);
System.out.println( " Ente: " + e.getId());
}
}
}
Inicio
7
Introduccin a las fechas (I)
La clase java.util.Date es la primera clase implementada en el API para el manejo de
fechas. Tiene severas limitaciones, en especial en la internacionalizacin.
A partir de la versin 1.1 manejamos java.util.Calendar y su subclase
java.util.GregorianCalendar.
Para mostrar el resultado por pantalla crearemos el mtodo util.mostrar():
package figuras.util;
import java.util.Calendar;

public class Fechas {
/**************************************************************************
* Muestra en consola la fecha y hora
**************************************************************************/
static public void mostrar(String mensaje, Calendar fec) {
System.out.println( mensaje + " Dia:"+fec.get( Calendar.DAY_OF_MONTH) + " Mes:" +
(fec.get( Calendar.MONTH)+1) +
" Ao:" + fec.get( Calendar.YEAR) +
" Hora:" + fec.get( Calendar.HOUR_OF_DAY) +
" Minuto:" + fec.get( Calendar.MINUTE) +
" Segundos:" + fec.get( Calendar.SECOND) +
" Milisegundos:" + fec.get( Calendar.MILLISECOND));
}
}
La llamada, con la fecha actual, podra ser:
Calendar cal = Calendar.getInstance();
Fechas.mostrar("Hola", cal);
El mes lo calcula empezando por 0, por lo que para mostrarlo sumamos uno

Inicio
8
Introduccin a las fechas (II)
Formas de crear, definir (set) y aumentar (add)
una fecha. Observar que en el mtodo set() el
mes empieza en cero (si quiere poner Marzo
debe indicar un 2):
Calendar fechaIni = Calendar.getInstance();
fechaIni.set(2007, 2, 1); // Empieza en 0. El 2 es Marzo
Fechas.mostrar("Fecha de inicio.", fechaIni);
Calendar fechaFin = Calendar.getInstance();
fechaFin.add( Calendar.DAY_OF_MONTH, 30);
Fechas.mostrar( "Fecha de fin (actual+30 das).", fechaFin);
Para disminuir una fecha se usa tambin add(), usando
como segundo argumento un nmero negativo

Inicio
9
Diferencia y comparacin de fechas
Vamos a calcular la diferencia entre fechas. Para ello nos
serviremos de getTimeInMillis(), que devuelve la fecha en
milisegundos:
System.out.println("\nCALCULO DE DIAS DE DIFERENCIA:");
long dif = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis();
double d = dif / (1000 * 60 * 60 * 24); // conversion miliseg a dias
System.out.println( "Hay " + d + " das entre la fecha de inicio y la de fin");
Para la comparacin tenemos los mtodos before(), after()
e equals(). Un ejemplo:
if ( fechaIni.before(fechaFin) )
System.out.println( fechaIni.getTime() +" ES ANTERIOR A "+ fechaFin.getTime());

Inicio
10
Entrada de usuario en forma de String
Un problema tpico es que el usuario introduce por teclado un String con la fecha en su formato
local y tenemos que convertirlo en un tipo Calendar. En nuestro ejemplo simulamos que el usuario
ha introducido el 28 de Febrero de 1988:
String strFecha = "28/2/1988"; // As lo introducira el usuario por teclado
System.out.println("\nVAMOS A CONVERTIR A CALENDAR LA FECHA + strFecha );
Calendar cFecha = Fechas.getFecha( strFecha, "/");
Fechas.mostrar("La fecha en formato Calendar es ", cFecha );
Para resolver el problema hemos creado el mtodo getFecha():
static public Calendar getFecha( String strFecha, String separador ) {
try {
java.util.StringTokenizer st = new java.util.StringTokenizer(strFecha, separador);
int dia = 0, mes = 1, anio = 0;

if (st.hasMoreElements())
dia = Integer.parseInt((String) st.nextElement());

if (st.hasMoreElements())
mes = Integer.parseInt((String) st.nextElement()) - 1; // El mes empieza en 0

if (st.hasMoreElements())
anio = Integer.parseInt((String) st.nextElement());

Calendar cal = Calendar.getInstance();
cal.set(anio, mes, dia);
return cal;
} catch (Exception e) {
return null;
}
}


Inicio
11
Formateo de fechas
Vamos a convertir la fecha a un formato local. Para ms
informacin ver http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html:

java.text.SimpleDateFormat sdfFecha =new java.text.SimpleDateFormat("dd/MM/yyyy");
java.text.SimpleDateFormat sdfHora = new java.text.SimpleDateFormat("HH:mm");
System.out.println("Fecha formateada:" + sdfFecha.format(fechaIni.getTime()));
System.out.println("Hora formateada:" + sdfHora.format(fechaIni.getTime()));
Inicio
12
Otros
La clase Random (java.util.Random) genera nmeros
aleatorios. Ejemplo que genera nmeros aleatorios entre
cero y uno:
Random r = new Random();
for (int i=1; i<=10; i++ )
System.out.println( r.nextDouble() );
Aunque el uso del mtodo static double random() de la clase
Math tiene el mismo resultado
En Random tenemos double nextGaussian(), que nos da
una distribucin gaussiana centrada en el cero y con una
desviacin estndar en torno a 1. Tambin tenemos nextInt(n)
que nos da nmeros entre 0 y n-1 (incluido)
En la clase Math tiene mltiples utilidades: abs(a) para
el valor absoluto, pow(a,b) para elevar a a b,
sqrt(a) para la raiz cuadrada, etc.

Você também pode gostar