|
Les outils Java |
Gestion de collections de
données
Gestion des dates
Génération de
nombres aléatoires
Autres classes d'outils
Le package java.util rassemble des classes d'utilitaires dont les plus intéressantes permettent de gérer les collections de données (classes Vector, Stack, Dictionary, Hashtable, BitSet et interface Enumeration).
L'interface java.util.Enumeration
Cette interface est implémentée par les classes désirant pouvoir faire une énumération des objets mémorisés par une autre classe, comme par exemple la classe Vector. Les méthodes de cette interface sont généralement utilisées dans une boucle while, comme dans l'exemple suivant (à recopier dans un fichier EssaiEnumeration.java que vous compilez avec l'instruction javac EssaiEnumeration.java pour ensuite l'exécuter avec java ou Java Runner, grâce à l'instruction java EssaiEnumeration) :
import java.util.*; // Classe mémorisant des chaînes de caractères class CollectionChaines { String [ ] tabChaines; int nbreChaines = 0; CollectionChaines (int max) { tabChaines = new String [max]; } public void ajouterChaine (String chaine) { tabChaines [nbreChaines++] = chaine; } public Enumeration chaînes () { return new EnumerationChaines (this); } } // Classe permettant d'énumérer les chaînes de CollectionChaines class EnumerationChaines implements Enumeration { CollectionChaines collection; int indice = 0; public EnumerationChaines (CollectionChaines collection) { this.collection = collection; } public boolean hasMoreElements () { return indice < collection.nbreChaines; } public Object nextElement () { if (indice < collection.nbreChaines) return collection.tabChaines [indice++]; else throw new NoSuchElementException (); } } // Classe d'essai public class EssaiEnumeration { public static void main (String [ ] args) { // Création d'une collection de chaînes et ajout de 3 chaînes CollectionChaines donnees = new CollectionChaines (10); donnees.ajouterChaine ("Toto"); donnees.ajouterChaine ("Titi"); donnees.ajouterChaine ("Tutu"); // Enumération des éléments de la collection Enumeration enumeration = donnees.chaînes (); while (enumeration.hasMoreElements ()) System.out.println (enumeration.nextElement ()); } }Méthodes
public boolean hasMoreElements ()Cette méthode doit renvoyer true s'il reste encore un ou plusieurs éléments à énumérer.
public Object nextElement () throws NoSuchElementExceptionCette méthode doit retourner l'élément suivant à énumérer ou déclencher une exception de classe NoSuchElementException si le dernier élément a déjà été énuméré.
La classe java.util.Vector
Cette classe qui implémente l'interface Cloneable, permet de créer un vecteur. Ce type d'ensemble permet de mémoriser un ensemble d'objets de classe quelconque dans un tableau de taille variable (ces éléments peuvent être éventuellement égal à null). Comme pour les tableaux, l'accès aux éléments se fait par un indice. La classe Vector comporte de nombreuses méthodes qui permettent d'ajouter, d'insérer, de supprimer ou de rechercher des éléments. Toutes les méthodes de Vector sont final sauf clone ().
Champs
protected Object [ ] elementData protected int elementCount protected int capacityIncrementCes champs correspondent aux éléments mémorisés, au nombre d'éléments mémorisés et à l'incrément à appliquer au tableau elementData quand il est rempli. Ces classes étant protected ne sont accessibles que dans les classes dérivées de Vector.
Constructeurs
public Vector () public Vector (int initialCapacity) public Vector (int initialCapacity, int capacityIncrement)Ces constructeurs permettent de créer un vecteur de capacité initiale initialCapacity (égal à 10 par défaut) et d'incrément capacityIncrement (égal à 0 par défaut). Si l'incrément est nul, la taille du tableau mémorisant les éléments du vecteur sera doublée à chaque fois que ce tableau a besoin d'être agrandi.
Méthodes
public final synchronized void addElement (Object obj)Ajoute l'élément obj en fin de vecteur. Si le tableau du vecteur est trop petit, il est automatiquement agrandi.
public final synchronized void insertElementAt (Object obj, int index) throws IndexOutOfBoundsExceptionInsère l'élément obj à l'indice index. Si le tableau du vecteur est trop petit, il est automatiquement agrandi.
public final synchronized Object elementAt (int index) throws IndexOutOfBoundsException public final synchronized void setElementAt (Object obj, int index) throws IndexOutOfBoundsExceptionCes méthodes permettent d'interroger ou de modifier l'élément mémorisé à l'indice index. Si index est plus grand que le nombre d'éléments du vecteur, une exception IndexOutOfBoundsException est déclenchée.
public final synchronized boolean removeElement (Object obj) public final synchronized void removeElementAt (int index) throws IndexOutOfBoundsException public final synchronized void removeAllElements ()Ces méthodes permettent de retirer du vecteur, soit l'élément obj, soit l'élément mémorisé à l'indice index, soit tous les éléments mémorisés. Les deux premières méthodes décalent les éléments qui suivent l'élément retiré du tableau du vecteur à un indice inférieur.
public final boolean isEmpty ()Renvoie true si le vecteur est vide.
public final int size ()Renvoie le nombre d'éléments mémorisés dans le vecteur.
public final synchronized void setSize (int newSize)Modifie la taille du vecteur. Si newSize est plus petit que le nombre d'éléments courant du vecteur, les derniers éléments sont perdus, sinon un ensemble d'éléments égaux à null sont ajoutés pour atteindre la taille newSize.
public final int capacity () public final synchronized void ensureCapacity (int minCapacity)Ces méthodes permettent d'interroger ou de modifier la capacité courante du vecteur. La capacité du vecteur est le nombre maximum que son tableau peut contenir avant que celui-ci est besoin d'être agrandi.
public final synchronized void trimToSize ()Réduit la capacité du tableau du vecteur aux nombres d'éléments mémorisés par le vecteur.
public final synchronized Object firstElement () throws NoSuchElementException public final synchronized Object lastElement () throws NoSuchElementExceptionCes méthodes renvoient le premier ou le dernier élément mémorisé par le vecteur.
public final synchronized void copyInto (Object array [ ]) throws IndexOutOfBoundsExceptionRecopie dans le tableau array l'ensemble des éléments mémorisés par le vecteur. Si array est top petit, une exception IndexOutOfBoundsException est déclenchée.
public final synchronized Enumeration elements ()Permet d'énumérer les éléments du vecteur.
public final boolean contains (Object elem)Renvoie true si le vecteur contient un élément égal à elem. La méthode equals () de la classe de l'objet elem est utilisée pour comparer les objets.
public final int indexOf (Object elem) public final synchronized int indexOf (Object elem, int index) throws IndexOutOfBoundsException public final int lastIndexOf (Object elem) public final synchronized int lastIndexOf (Object elem, int index) throws IndexOutOfBoundsExceptionCes méthodes renvoient l'indice du premier ou du dernier élément égal à elem, ou -1 si elem n'est pas trouvé. La méthode equals () de la classe de l'objet elem est utilisée pour comparer les objets. index permet d'éventuellement spécifier le premier indice à partir duquel commencer la recherche.
public synchronized Object clone ()Renvoie un clone du vecteur. Les éléments du vecteur ne sont pas clonés eux-mêmes. Cette méthode outrepasse la méthode clone () de la classe Object.
public final synchronized String toString ()Cette méthode outrepasse la méthode toString () de la classe Object, pour renvoyer une chaîne de caractères décrivant la liste des éléments mémorisés par le vecteur.
Exemples
Application ConcatenationFichiers.
Applet PaperBoardClient.La classe java.util.Stack
Cette classe qui dérive de Vector permet de créer des piles, où vous pouvez empiler un objet avec la méthode push (), retirer l'élément en haut de la pile avec pop (), ou consulter sans le retirer l'élément en haut de la pile avec peek ().
Méthodes
public Object push (Object item) public Object pop () throws EmptyStackException public Object peek () throws EmptyStackException public boolean empty () public int search (Object o)La classe java.util.Dictionary
Cette classe abstract permet de créer un dictionnaire représenté par un ensemble d'entrées associant un élément et une clé. Chaque clé du dictionnaire est unique et est associé au plus à un élément, mais un même élément peut avoir plusieurs clés d'accès. Les éléments et les clés devant être de la classe Object, le cast de références permet donc d'utiliser n'importe quel type de classe pour les clés et les éléments (chaînes de caractères, classes d'emballage des nombres ou d'autres classes).
Un dictionnaire peut être comparé à un tableau : Dans un tableau tab, vous mémorisez un ensemble d'éléments accessible grâce à un indice entier i, par l'expression tab [i]. Il est possible de mémoriser plusieurs fois le même objet dans tab à des indices différents, mais par contre chaque indice i est unique et vous permet d'accéder aux différents éléments du tableau grâce à tab [i]. Dans un dictionnaire dict, vous mémorisez de la même manière des éléments auquel vous accédez grâce à une clé plutôt que par un indice entier. Cette clé peut être de n'importe quelle classe, ce qui permet de mémoriser les éléments d'une manière plus riche qu'avec un simple indice entier. Pour faire un parallèle entre l'utilisation d'un tableau tab et d'un dictionnaire dict, l'expression tab [i] = element a pour équivalent dict.put (cle, element) et l'expression element = tab [i] a pour équivalent element = dict.get (cle).
Voici toutes les méthodes que doit implémenter une classe dérivant de Dictionary, pour pouvoir être instanciée (comme la classe Hashtable) :Constructeur
public Dictionary ()Méthodes
abstract public int size ()size () doit renvoyer le nombre d'entrées dans le dictionnaire. Chaque clé devant être unique ce nombre est égal au nombre de clés.
abstract public boolean isEmpty ()isEmpty () renvoie true si le dictionnaire ne contient aucune entrée.
abstract public Object get (Object key)Cette méthode doit renvoyer l'élément associé à la clé key, ou null si la clé key n'existe pas.
abstract public Object put (Object key, Object element)Cette méthode doit ajouter dans le dictionnaire une entrée associant la clé key avec l'élément element. Si une entrée avec une clé égale à key existe déjà (par la méthode equals ()), l'élément de cette entrée est renvoyé par put () après avoir été remplacé par element. Sinon put () renvoie null, après avoir ajouté une nouvelle entrée.
abstract public Object remove (Object key)Cette méthode doit supprimer du dictionnaire l'entrée ayant comme clé key. Si une entrée avec une clé égale à key existe déjà (par la méthode equals ()), l'élément de cette entrée est renvoyé par remove () après que cette entrée ait été supprimée. Sinon, remove () renvoie null.
abstract public Enumeration keys () abstract public Enumeration elements ()Ces méthodes doivent renvoyer un objet d'une classe implémentant Enumeration permettant d'énumérer les clés et les éléments du dictionnaire respectivement.
La classe java.util.Hashtable
Cette classe implémente l'interface Cloneable et dérive de la classe Dictionary dont elle implémente toutes les méthodes, en y ajoutant certaines méthodes. Les tables de hash utilise la valeur que retourne la méthode hashCode () des clés, pour organiser le rangement des entrées de la table afin que get () fonctionne avec efficacité. Les objets utilisés comme clés dans une table de hash devraient avoir leur classe qui outrepassent les méthodes equals () et hashCode () pour un fonctionnement correct (voir la classe Object).
Constructeurs
public Hashtable (int initialCapacity, float loadFactor)Crée une table de hash avec une capacité initiale de initialCapacity entrées. La table est réorganisée avec la méthode rehash (), à chaque fois que le nombre d'entrées atteint loadFactor multiplié par la capacité de la table (0 < loadFactor < 1) . Plus loadFactor est petit, plus souvent la table sera réorganisée, mais attention cette opération prend du temps ! Si c'est possible, Il vaut mieux prévoir une table de hash avec une capacité initiale proche du nombre d'éléments à mémoriser dans la table, pour éviter que la table ait trop souvent à se réorganiser.
public Hashtable (int initialCapacity) public Hashtable ()Méthodes
public int size () public boolean isEmpty () public synchronized Object get (Object key) public synchronized Object put (Object key, Object element) public synchronized Object remove (Object key) public synchronized Enumeration keys () public synchronized Enumeration elements ()Ces méthodes outrepassent celles de la classe Dictionary. Pour plus d'informations, consultez la classe Dictionary.
public synchronized boolean contains (Object element) public synchronized boolean containsKey (Object key)Ces méthodes renvoient true si respectivement un élément ou une clé existe dans la table.
public synchronized void clear ()clear () supprime toutes les entrées (clés et éléments) de la table.
protected void rehash ()Cette méthode agrandit et réorganise la table pour plus d'efficacité.
public synchronized Object clone ()Renvoie un clone de la table de hash. Cette méthode outrepasse la méthode clone () de la classe Object.
public synchronized final String toString ()Cette méthode outrepasse la méthode toString () de la classe Object, pour renvoyer une chaîne de caractères décrivant l'ensemble des entrées (clé + élément) de la table.
La classe java.util.Properties
Cette classe dérivant de Hashtable désigne une table de hash ne pouvant mémoriser que des chaînes de caractères et comportant des fonctionnalités de sauvegarde/lecture dans un fichier.
Cette classe ressemble un peu à la gestion des fichiers profile Windows (.INI), et la classe System l'utilise pour mémoriser les propriétés associés à un programme Java.Champ
protected Properties defaultsConstructeurs
public Properties () public Properties (Properties defaults)Méthodes
public String getProperty (String property) public String getProperty (String property, String defaultValue)Ces méthodes renvoient la propriété de nom property, ou defaultValue si cette propriété n'est pas définie.
public Enumeration propertyNames ()Permet d'énumérer l'ensemble des noms de propriétés.
public void list (PrintStream out)Ecrit sur le flux de données out la liste des propriétés et de leur valeur.
public synchronized void load (InputStream in) throws IOException public synchronized void save (OutputStream out, String header)Ces méthodes permettent d'écrire ou de lire un ensemble de propriétés à patir des flux de données in ou out. Le format des données est ensemble de couples property=value.
La classe java.util.BitSet
Cette classe final qui implémente l'interface Cloneable permet de manipuler aisément un ensemble de bits. Les objets de cette classe ont leur nombre de bits mémorisés qui croit automatiquement à l'appel des méthodes set () et clear (). Les méthodes and (), or () et xor () permettent d'effectuer les opérations ET, OU et OU Exclusif bit à bit sur les ensembles de bits des objets de cette classe.
Constructeurs
public BitSet () public BitSet (int nbits)Les nbits bits qu'une instance de la classe BitSet mémorise sont stockés dans un tableau dont les éléments sont de type long (64 bits).
Méthodes
public boolean get (int bitIndex) public void set (int bitIndex) public void clear (int bitIndex) public void and (BitSet set) public void or (BitSet set) public void xor (BitSet set) public int size () public boolean equals (Object obj) public int hashCode () public Object clone () public String toString ()
La classe java.util.Date
Cette classe permet de manipuler les dates. Les objets de cette classe représente un moment donné à la seconde près. La classe Date fournit des méthodes permettant d'obtenir ou de modifier l'année, le mois, le jour, l'heure, la minute ou la seconde d'une date et de comparer des dates.
- L'année est un int égal à 0 pour l'année 1900.
- Le mois est un int allant de 0 pour le mois de Janvier à 11 pour le mois de décembre.
- Le jour du mois est un int allant de 1 à 31.
- L'heure est un int allant de 0 à 23.
- La minute est un int allant de 0 à 59.
- La seconde est un int allant de 0 à 59.
Les objets de la classe Date ne sont pas des horloges. A chaque fois que vous voulez obtenir le temps courant, utilisez la méthode currentTimeMillis () de la classe System, ou créez un nouvel objet de classe Date avec le constructeur par défaut.
Constructeurs
public Date () public Date (long time) public Date (int year, int month, int date) public Date (int year, int month, int date, int hours, int minutes) public Date (int year, int month, int date, int hours, int minutes, int seconds) public Date (String s) throws IllegalArgumentExceptionMéthodes
public int getYear () public void setYear (int year) public int getMonth () public void setMonth (int month) public int getDate () public void setDate (int date) public int getHours () public void setHours (int hours) public int getMinutes () public void setMinutes (int minutes) public int getSeconds () public void setSeconds (int seconds)Ces méthodes permettent d'interroger ou de modifier l'année, le mois, le jour du mois, l'heure, la minute ou la seconde d'une date.
public int getDay ()Renvoie le jour de la semaine sachant que le nombre 0 correspond à dimanche.
public long getTime () public void setTime (long time)Ces méthodes permettent d'interroger ou de modifier le temps en millisecondes
public boolean before (Date when) public boolean after (Date when)Ces méthodes renvoient true si une date est inférieure ou supérieure à la date when.
public int getTimezoneOffset () public static long UTC (int year, int month, int date, int hours, int minutes, int seconds) public static long parse (String s) throws IllegalArgumentExceptionRenvoie le temps à partir d'une chaîne de caractère respectant le format IETF.
public String toLocaleString ()Renvoie une chaîne de caractères décrivant la date courante respectant la notation locale.
public String toGMTString ()Renvoie une chaîne de caractères décrivant la date courante respectant la notation GMT.
public boolean equals (Object obj) public int hashCode () public String toString ()Exemples
Applets TraitementTexte, MiseAJourHorloge et Horloge.
La classe java.util.Random
Les méthodes de la classe Random permettent de générer des nombres aléatoires, comme la méthode random () de la classe java.lang.Math. Ces méthodes peuvent générer des nombres entiers, décimaux (entre 0. inclus et 1. exclus) ou respectant la courbe de Gauss (entre -1. et 1.).
Constructeurs
public Random () public Random (long seed)Le second constructeur permet de créer un générateur dont on fournit la base de départ. Pour une même base, la série de nombres aléatoires générées sera toujours la même à chaque exécution d'un programme. Le premier constructeur crée un générateur dont la base est égale au temps courant. Ce temps étant toujours différent d'une exécution à l'autre, chaque série sera différente à chaque exécution.
Méthodes
public synchronized void setSeed (long seed) public int nextInt () public long nextLong () public float nextFloat () public double nextDouble () public synchronized double nextGaussian ()Exemples
Applets ObservateurCalcul, DrawIt et ImageNoirEtBlanc.
La classe java.util.StringTokenizer
Cette classe permet d'énumérer à partir d'une chaîne de caractères str un ensemble de sous-chaînes séparées par des délimiteurs (voir aussi la classe java.io.StreamTokenizer).
Constructeurs
public StringTokenizer (String str, String delim, boolean returnTokens) public StringTokenizer (String str, String delim) public StringTokenizer (String str)Permet de spécifier la chaîne str dans laquelle on recherche des sous-chaînes. Les sous-chaînes sont séparées par des délimiteurs qui peuvent être n'importe quel caractère de delim. Si returnTokens est true, l'énumération rendra les sous-chaînes et les délimiteurs. Par défaut, le délimiteur est un espace et returnTokens est égal à false.
Méthodes
public boolean hasMoreElements () public boolean hasMoreTokens ()Ces deux méthodes renvoient vraies si la chaîne str a encore des sous-chaînes à énumérer.
public Object nextElement () throws NoSuchElementException public String nextToken () throws NoSuchElementException public String nextToken (String delim) throws NoSuchElementExceptionCes trois méthodes renvoient la sous-chaîne suivante de str (ou le délimiteur si returnTokens est true), et avance la position de recherche dans str au caractère suivant la sous-chaîne renvoyée. La troisième méthode permet de remplacer les délimiteurs recherchés.
public int countTokens ()Renvoie le nombre de sous-chaînes restant à énumérer.
L'interface java.util.Observer
Toute classe qui implémente cette interface peut instancier un observateur d'un objet observé. Cette objet observé dont la classe est Observable ou ses dérivées, peut prévenir tous ses observateurs d'un changement en appelant automatiquement la méthode update () de chacun d'eux. Voir la classe Observable.
Méthode
public void update (Observable o, Object arg)Exemple
Applet ObservateurCalcul.
La classe java.util.Observable
Cette classe permet de créer des objets observés par des observateurs, ces derniers étant des objets dont la classe implémente l'interface Observer. Quand un objet observé appelle la méthode notifyObservers () à la suite d'un changement, chacun de ses observateurs voit sa méthode update () appelée.
La méthode notifyObservers () n'a d'effet que si l'objet observé a changé suite à un appel à la méthode setChanged (). Comme setChanged () est protected, il n'est possible de l'invoquer qu'à partir d'une sous classe d'Observable, ce qui vous oblige à créer une classe dérivée de la classe Observable pour pouvoir vous en servir.Constructeur
public Observable ()Méthodes
public synchronized void addObserver (Observer o) public synchronized void deleteObserver (Observer o) public synchronized void deleteObservers () public synchronized int countObservers ()Ces méthodes permettent d'ajouter, de supprimer ou de compter les observateurs d'un objet.
public void notifyObservers () public synchronized void notifyObservers (Object arg)Ces méthodes provoqueront l'appel de la méthode update () de chacun des observateurs, si l'objet a appelé setChanged () pour spécifier que l'objet a été modifié. arg, par défaut égal à null, est passé en paramètre à la méthode update () des observateurs.
protected synchronized void setChanged () protected synchronized void clearChanged () public synchronized boolean hasChanged ()Ces méthodes permettent de valider, d'annuler ou d'interroger un flag indiquant si l'objet a changé.
Voici un exemple illustrant l'utilisation de la classe Observable et de l'interface Observer, avec une applet affichant des sinusoïdes, dérivée de l'exemple du chapitre sur les threads :
et le programme Java correspondant (à copier dans un fichier dénommé ObservateurCalcul.java et invoqué à partir d'un fichier HTML) :
import java.awt.*; import java.applet.Applet; import java.util.*; public class ObservateurCalcul extends Applet implements Observer { private CalculateurObservable calculateur; private int [ ] courbe; private Random generateur = new Random (); public void start () { // Création d'un calculateur CalculateurObservable calculateur = new CalculateurObservable (size ().width, size ().height); // L'applet se déclare comme observateur du calculateur calculateur.addObserver (this); } public void stop () { calculateur.stop (); } // Implémentation de l'interface Observer public void update (Observable calculateur, Object courbe) { // Récupération de la courbe calculée this.courbe = (int [])courbe; // Affichage de la nouvelle courbe repaint (); // repaint () efface le fond puis appelle paint () } // Méthode appelée par le système pour mettre à jour le dessin de l'applet public void paint (Graphics gc) { // Création d'une couleur aléatoire gc.setColor (new Color (generateur.nextFloat (), generateur.nextFloat (), generateur.nextFloat ())); if (courbe != null) // Dessin de la courbe en reliant les points un à un for (int i = 1; i < courbe.length; i++) gc.drawLine (i - 1, courbe [i - 1], i, courbe [i]); } } class CalculateurObservable extends Observable implements Runnable { private int width; private int height; private Thread threadCalculateur; public CalculateurObservable (int width, int height) { this.width = width; this.height = height; // Démarrage d'un thread de calcul (threadCalculateur = new Thread (this)).start (); } public void stop () { threadCalculateur.stop (); } public void calculerCourbe () { int [] courbe = new int [width]; // Calcul d'une sinusoïde avec fréquence aléatoire double pasCalcul = 2 * Math.PI / courbe.length / Math.random (); for (int i = 0; i < courbe.length; i++) courbe [i] = (int)((Math.sin (i * pasCalcul) + 1) * height / 2); // Nouveau calcul setChanged (); // Appel de la méthode update () des observateurs notifyObservers (courbe); } public void run () { try { while (threadCalculateur.isAlive ()) { // Calculer une courbe calculerCourbe (); Thread.sleep (200); } } catch (InterruptedException e) { } } }
|