Partie IV programmation à la chaîne
Leçon 1 et 2 Leçon 3 Leçon 4 Leçon 5
Les objets String et StringBuffer
Dans des langages comme le C ou le C++, les chaînes de caractères sont traitées comme des tableux de caractères où il est possible de se déplacer en utilisant l'arithmétique de pointeurs. En Java, vous pouvez également considérer vos chaînes comme des tableaux mais il est bien plus efficace de recourir aux classes String et StringBuffer.
A côté de déclarations valides comme :
char[] carac = { 'q' , 'w' , 'e' , 'r' , 't' , 'y' } ;
ou
char[] carac = new char (3);
carac[0] = 'a';
carac[1] = 'b';
carac[2] = 'c';
vous disposez de l'objet String bien plus efficace pour la manipulation de textes et l'internationalisation et qui se déclare comme suit:
String s = new String ("Java c est pas du deca");
qui peut également s'écrire en abrégé comme ceci:
String s = "Java c est pas du deca";
De cette manière, vous n'aurez pas à vous tracasser comme en C de vérifier si votre tableau de caractères est grand assez pour contenir votre chaîne. L'objet String stocke chaque caractère sur deux octets de manière à tirer parti d'Unicode.
Java recourt à la version 2.0 du jeu de caractères Unicode que vous pouvez découvrir sur http://www.unicode.org.
Unicode reprend 38885 caractères internationaux, les 128 premiers correspondant aux caractères ASCII (ANSI X3.4) de l'American Standard Code for Information Interchange.
Un objet String est de type read-only tandis qu'un objet StringBuffer s'utilise en mode lecture et écriture. Un String doit être initialisé à la création tandis qu'un StringBuffer, un peu plus gourmand en ressources CPU, peut être modifié par la suite. La méthode toString() permet de convertir un StringBuffer en String comme ceci :
StringBuffer sb = new StringBuffer(" je crée d abord un stringbuffer")
String s = sb.toString();
Pour constituer un StringBuffer à partir d'une saisie clavier, vous pouvez utiliser une méthode appendChar()
char c:
StringBuffer sb;
while (( c = (char) System.in.read()) != -1)
sb.appendChar(c);
L'opérateur + est de plus simples pour manipuler une chaîne.
StringBuffer sb = new StringBuffer (" ceci est un String");
sb = sb + "Buffer";
Vous pouvez aussi créer des chaînes vides comme ceci :
String str = new String(); String str = ""; String str = "";
La class String dispose de sept constructeurs :
public String() pour créer une chaîne vide public String(String value) pour créer une chaîne à partir d'une autre chaîne public String(char value[]) pour créer une chaîne à partir d'un tableau de caractères public String(char value[], int offset, int count) pour créer une chaîne à partir d'une partie d'un tableau public String(byte ascii[], int hibyte, int offset, int count) pour constituer une chaîne Unicode en utilisant hibyte comme octet de poids fort pour chaque caractère Unicode public String(byte ascii[], int hibyte) pour constituer une chaîne Unicode public String (StringBuffer buffer) pour recopier un StringBuffer dans une chaîne
L'objet String vous fournit une multitude de méthodes pour obtenir de l'information à propos d'une String.
La méthode length() vous renvoie la longueur d'une chaîne
String str = "ma string"; int long = str.length();
La variable long contiendra 9 qui correspond à la longueur de la chaîne espaces compris.
La méthode startsWith() vous permet d'examiner le préfixe d'une chaîne:
String str = "ceci est un string";
boolean resultat = str.startsWith("ceci");
La variable resultat sera égale à true puisque str commence bien par "ceci"
Inutile de vous expliquer que la méthode endsWith() s'emploie de la même façon pour examiner le suffixe d'une chaîne.
String str = "ceci est un string";
boolean resultat = str.endsWith("ceci");
resultat sera égal à false.
Pour trouver la première occurrence d'un caractère dans une chaîne, vous pouvez faire appel à la méthode
indexOf():
String str = "ceci est un string";
int indice = str.indexOf('i');
indice = str.indexOf('i', indice+1);
indice = str.indexOf("est");
A la seconde ligne, indice vaut 3 c'est-à-dire la position du premier i dans la chaîne. A la ligne suivante, indice contiendra la position du i suivant. A la dernière ligne, vous recherchez la position de la sous-chaîne "est" dans la chaîne complète.
Pour trouver à rebours la dernière occurrence d'un caractère dans une chaîne, vous pouvez faire appel à la méthode
lastIndexOf():
String str = "ceci est un string";
int indice = str.lastIndexOf('i');
Comparaison
La comparaison de chaînes de caractères s'opère via la méthode equals()
String str = "ceci est un string";
boolean resultat = str.equals("ceci est un string");
La méthode equalsIgnoreCase() compare deux chaînes sans tenir compte des différences mùinuscules/majuscules.
La méthode compareTo() a été pensée pour comparer l'ordre alphabétique de deux chaînes. Elle retourne 0 si les deux chaînes sont identiques, un nombre négatif si la chaîne précède celle donnée en argument à la méthode, un nombre positif dans le cas inverse.
String str = "ceci";
int valeur = str.compareTo("cela");
Extraction
La méthode charAt() extrait un caractère d'une chaîne
String str = "ceci est un string"; Char c = str.charAt(3);
Attention, dans l'exemple c vaudra i puisque les programmeurs ont la fâcheuse habitude de commencer à compter à partir de 0.
Pour copier une portion de String dans un tableau de caractères, vous disposez de la méthode getChars():
String str = " ceci est un string "; char chr[] = new char[20]; str.getChars(3, 7, chr, 0); byte byt[] = new byte[20]; str.getBytes(3, 7, byt, 0);
Dans cet exemple, chr contiendra les caractères entre la position 3 et 7. La méthode getBytes() réalise la même opération sur un tableau d'octets.
Une autre solution est le recours à la méthode subString() qui extrait une sous-chaîne à partir de l'indice donné jusqu'à la fin de la chaîne.
String str1 = "ceci est un string"; String str2 = str1.substring(5); String str3 = str1.substring(5,7);
Ici, l'objet str2 vaudra = "est un string" et str3 "est"
La classe String n'est pas prévue pour la modification de chaînes mais elle contient quand même une méthode
replace() qui crée un nouvel objet String incluant les modifications apportées à la chaîne originale.
String str1 = "ceci est un string";
String str2 = str1.replace('e','o');
str1 n'a pas changé mais str2 contiendra "coci ost un string".
La méthode concat() concatene ou additionne deux chaînes pour en créer une troisième de la même manière que l'opérateur +
String str1 = "ceci est un string";
String str2 = str1.concat(" concaténé");
Bien sûr, str2 devient "ceci est un string concaténé")
Les méthodes toUpperCase() et toLowerCase() renvoient une chaîne qui a été convertie dans la casse appropriée.
String str1 = "ceci est un string"; String str2 = str1.toUpperCase(); String str3 = str2.toLowerCase();
La méthode trim() nettoie une chaîne des espaces en tête et en queue de chaîne.
String str1 = " ceci est un string "; String str2 = str1.trim();
La méthode valueOf() convertit n'importe quel type de données en une chaîne.
Int valeur =5; String str1 = ""; String str2 = str1.valueOf(valeur); valueOf()existe dans les déclinaisons suivantes public static String valueOf(boolean b); public static String valueOf(char c); public static String valueOf(int i); public static String valueOf(long l); public static String valueOf(float f); public static String valueOf(double d);
public static String valueOf(Object ob)
public static String valueOf(char[] data); public static String copyValueOf(char[] data);
StringBuffer
Avec la classe StringBuffer, vous pouvez travailler directement sur des chaînes sans devoir en créer de nouvelles. Ses constructeurs sont :
StringBuffer() créant une chaîne vide
StringBuffer(int length) créant une chaîne vide de longueur donnée StringBuffer(String str) initialisant une chaîne à partir d'une autre.
StringBuffer dispose également de la méthode length mais aussi d'une méthode capacity renvoyant le nombre maximal de caractères pouvant être inclus dans le buffer. Comme dans la classe String, vous pouvez faire appel aux méthodes charAt() et getChars():
Vous pouvez définir la longueur initiale d'un StringBuffer grâce à la méthode setLength()ou obtenir une taille de buffer garantie avec ensureCapacity() Changer un caractère à une position donnée devient enfin aisé grâce à la méthode setCharAt() qui dans l'exemple suivant remplacera le i en 3e position par un O :
StringBuffer sb = new StringBuffer ("String");
sb.setCharAt(3,'O');
Vous pourrez aussi ajouter des caractères en fin de chaînes via append()ou en insérer via insert()qui peuvent se déclarer comme suit : public StringBuffer append(boolean b) public StringBuffer append(char c) public StringBuffer append(int i) public StringBuffer append(long l) public StringBuffer append(float f) public StringBuffer append(double d) public StringBuffer append(String str) public StringBuffer append(Object ob) public StringBuffer append(char[] data) public StringBuffer insert(int offset, boolean b) public StringBuffer insert(int offset, char c) public StringBuffer insert(int offset, int i) public StringBuffer insert(int offset, long l) public StringBuffer insert(int offset, float f) public StringBuffer insert(int offset, double d)
Une autre classe bien utile est StringTokenizer qui permet de découper une chaîne en une série de "jetons" délimités par des espaces.
StringTokenizer tokenizer = new StringTokenizer("Un deux trois piano");
Pour extraire les "jetons", vous disposez de la méthode nextToken() utilisable comme suit :
StringTokenizer tokenizer = new StringTokenizer("Un deux trois piano");
int count = tokenizer.countTokens();
while (tokenizer.hasMoreTokens())
String token = tokenizer.nextToken();
Images
Découvrons maintenant comment afficher des images à partir d'une applet Java. Supposons que nous voulons afficher une image best.gif se trouvant dans le même répertoire que le fichier .class contenant l'applet en cours d'exécution. Il nous faudra faire appel à la méthode getCodeBase() qui va nous renvoyer un URL correct pointant sur ce fameux répertoire. Ensuite, l'appel à getImage() nous permettra d'initialiser notre objet Image. Puis nous ferons appel à la classe Graphics et sa méthode drawImage() utilisé avec les paramètres suivants
g.drawImage(myImage, coordonnéex, coordonnéey, largeur, hauteur, this);
Notre appel aux méthodes getWidth() et getHeight() nous renvoie la largeur et la heuteur de l'image que nous exploitons pour tracer un cadre grâce à la méthode drawRect.
Le fichier exemple est disponible sur http://www.netline.be/formations/cours/java/monimage et le code source sur http://www.netline.be/formations/cours/java/monimage/monimage.txt
!!!! illustrations java1.jpg !!!
import java.awt.*;
import java.applet.*;
import java.net.*;
public class monimage extends Applet
{
Image best;
public void init()
{
URL codeBase = getCodeBase();
best = getImage(codeBase, "best.gif");
resize(250, 250);
}
public void paint(Graphics g)
{
int width = best.getWidth(this);
int height = best.getHeight(this);
g.drawRect(52, 52, width+10, height+10);
g.drawImage(best, 57, 57, width, height, this);
}
}