Le package java.util est un package "fourre-tout" qui contient des classes utiles pour la résolution de certains problèmes.
Le constructeur de cette classe peut prendre les formes Date( ), Date(long date), Date(int year, int month, int date), Date(int year, int month, int date, int hrs, int min), Date(int year, int month, int date, int hrs, int min, int sec) et Date(String s). Dans ce dernier cas, la chaîne est de la forme "day, date month year hrs:min:sec GMT" dans laquelle day est le nom du jour sous la forme Mon, Tue, Wed, Thu, Fri, Sat ou Sun. Dans les versions 1.0.x, les dates démarrent le 1 janvier 1970.
La version Date( ) correspond à la date courante. Dans la version Date(long date), date correspond au nombre de millisecondes écoulées entre le 1-01-1970 minuit et la date à définir. Les méthodes les plus utiles sont getTime( ) qui retourne un long correspond au nombre de millisecondes écoulées entre le 1-01-1970 et la date utilisée, getDate( ) qui retourne un int correspondant à la date du jour, getDay( ) qui retourne le jour, getMonth( ), getYear( ), getHours( ), getMinutes( ).
Les méthodes set correspondantes permettent de fixer les mêmes paramètres d'une date donnée.
Une originalité : les mois vont de 0 (janvier) à 11 (décembre).
L'exemple ci-dessous met en oeuvre un certain nombre de ce méthodes. On demande à l'utilisateur d'entrer sa date de naissance et on retourne son age.
import java.applet.*;
import java.awt.*;
import java.util.*; //importation du package
public class date10 extends Applet
{ int jour=15,mois=8,annee=70; //valeurs initiales
Font font = new Font("Helvetica",0,12);
Label lb1,lb2,lb3;
TextField tf1=new TextField(""+jour,2);
TextField tf2=new TextField(""+(mois-1),2);
TextField tf3=new TextField(""+annee,2);
Date D = new Date(); //date actuelle du client
String s;
public void init()
{ setBackground(Color.lightGray);
setFont(font);
lb1=new Label("Jour",2);
add(lb1); add(tf1);
lb2=new Label("Mois",2);
add(lb2); add(tf2);
lb3=new Label("Année",2);
add(lb3); add(tf3);}
public boolean action(Event evt, Object arg)
{ if (evt.target==tf1) {
s=tf1.getText(); jour=Integer.parseInt(s);}
else if (evt.target==tf2) {
s=tf2.getText(); mois=Integer.parseInt(s)-1;} //0 à 11 !!!
else if (evt.target==tf3){
s=tf3.getText(); annee=Integer.parseInt(s);}
else return super.action(evt,arg);
repaint(); return true;}
public void paint(Graphics g)
{ g.drawString("Nous sommes le : "+D,20,50);
g.drawString("Entrer votre date de naissance :",20,70);
Date Dnai = new Date(annee,mois,jour);
g.drawString("né(e) le : "+Dnai.toString(),20,90);
Date Dage = new Date((long)(D.getTime()-Dnai.getTime()));
s = "Vous avez "+(Dage.getYear()-70)+" ans, "; //origine 1970
s = s+Dage.getMonth()+" mois et ";
s = s+(Dage.getDate()-1)+" jours.";
g.drawString(s,20,110);
g.drawString(""+D.getTime()+" ms écoulées depuis le 01/01/1970 minuit",20,130);
}
Valider chaque saisie.
Cette classe permet de découper une chaîne de caractères en fonction de séparateurs (virgule, espace ...). Les utilisateurs des anciens BASIC retrouvent avec cette classe l'équivalent des instructions DATA.
Le constructeur StringTokenizer(String s, String sep) comporte deux paramètres : la chaîne s à découper et sep qui est une chaîne contenant les séparateurs à utiliser pour le découpage en éléments.
La méthode hasMoreTokens( ) retourne true tant que la chaîne s contient des éléments à découper. La méthode nextToken( ) retourne une chaîne qui contient l'élément en question. On utilise en général (comme dans l'exemple ci-dessous) une boucle while pour décomposer la chaîne s en ses différents éléments.
import java.applet.*;
import java.awt.*;
import java.util.*; //importer le package
public class version extends Applet
{ String s="10,15,24,36,,78;47,26 38,45,9"; //chaîne à découper
int Tab[] = new int[10]; //tableau des valeurs
public void paint(Graphics g)
{ int i=0;
StringTokenizer st =new StringTokenizer(s,"; ,"); //3 séparateurs ; , et blanc
while (st.hasMoreTokens()){ //boucle de lecture
Tab[i]=Integer.parseInt(st.nextToken()); //éléments du tableau
g.drawString(""+Tab[i],20,20+15*i);
i++;}}
}
Remarques
a) dans l'exemple ci-dessus, il serait bien plus simple de procéder directement à l'affectation du tableau au moyen de l'instruction :
Tab[] = {10,15,24,36,78,47,26,38,45,9};
b) noter que la seconde virgule entre 36 et 78 sera ignorée.
Cette classe permet de générer des nombres pseudo-aléatoires de façon plus complète que la méthode Math.random( ) de java.lang qui à chaque appel renvoie un double compris entre 0.0d et 1.0d .
Après appel du constructeur Random rnd = new Random( ); , il suffit d'utiliser la méthode qui correspond au type de nombre aléatoire que l'on désire obtenir.
rnd.nextInt( ) retourne un entier int compris entre Integer.MIN_VALUE (-2147488348) et Integer.MAX_VALUE (2147488347).
rnd.nextLong( ) retourne un entier long compris entre Long.MIN_VALUE et Long.MAX_VALUE.
rnd.nextDouble( ) et rnd.nextFloat( ) retournent un double ou un float compris entre 0 et 1.
rnd.nextGaussian( ) retourne un double avec une distribution gaussienne de moyenne 0.0 et de déviation 1.0.
Enfin la méthode setSeed(long seed) permet de fixer la valeur de la "graine" utilisée par le générateur pseudo-aléatoire. En fixant la valeur de la graine, on obtient toujours la même séquence de valeurs pseudo-aléatoires lors d'exécutions successives du programme.
La classe Vector permet de créer et de manipuler des tableaux d'objets dynamiques . La dimension du tableau peut en effet varier automatiquement quand on y insère de nouveaux éléments. Pour des raisons d'efficacité, il est conseillé d'accroître sa taille avant l'ajout d'un nombre important d'éléments afin de limiter les réallocations mémoire au minimum. Il n'y a pas de restrictions sur la nature des objets (on peut même mélanger des objets différents dans un Vector).
Les constructeurs sont Vector( ) qui crée un tableau vide de dimension nulle, Vector(int nb) qui crée un tableau vide de dimension nb et Vector(int nb, int inc) qui crée un tableau vide de dimension nb et dont la taille augmente de inc à chaque fois que la taille maximum est atteinte.
Il n'est pas possible de stocker de nombres dans un vecteur mais il est possible de stocker des instances des classes Integer, Double ... car ce sont des objets.
Les principales méthodes de cette classe sont :
addElement(Object obj) ajoute un élément à la fin de la liste.
capacity(int nb) retourne la taille actuelle.
contains(Object obj) retourne un booléen indiquant la présence ou l'absence de l'objet obj dans le Vector.
elementAt(int index) retourne l'élément situé à la place index.
indexOf(Object obj) donne l'index de l'objet obj.
insertElementAt(Object obj, int index) insert l'objet obj à la place index. Les éléments suivants l'index sont décalés vers le bas.
setElementAt(Object obj, int index) modifie l'objet à la place index.
removeElementAt(int index) supprime l'objet situé à index. Les éléments suivants l'index sont décalés vers le haut.
setSize(int nb) fixe la taille actuelle.
De la classe Vector dérive la classe Stack qui implémente une pile d'objets . La méthode push( ) place un objet sur le haut de la pile, pop( ) supprime l'objet situé sur le haut de la pile et la méthode peek( ) retourne l'objet situé sur le haut de la pile sans l'enlever.
Cette classe implémente une structure qui à chaque donnée associe une clé. C'est un tableau d'objets qui stocke ceux-ci avec des indices non numériques.
Les constructeurs sont Hashtable ( ) qui crée une table vide de dimension nulle, Hashtable(int nb) qui crée une table vide de dimension nb et Hashtable(int nb, float inc) qui crée une table vide de dimension nb et dont la taille augmente quand le nombre d'éléments de la table dépasse le produit nb*inc. (inc doit être compris entre 0.0f et 1.0f).
Les principales méthodes de cette classe sont :
put(Object key, Object data) ajoute un élément et sa clé à la table.
get(Object key) retourne l'élément de la table dont la clé est key.
remove(Object key) supprime l'élément de la table dont la clé est key.