I. La Classe String
I. La Classe String
I. La Classe String
Et de Technologie de Sousse
TD 8
I. LA CLASSE STRING
Le langage définit par ailleurs un opérateur capable de travailler avec des objets String,
l'opérateur + de concaténation.
Concaténation
Si dans un programme Java, l'un des opérandes du signe + se trouve être une chaîne de
caractères (de type String), alors ce signe + est l'opérateur de concaténation. Si les deux
opérandes sont des chaînes de caractères, le résultat est la concaténation des chaînes de
caractères. Si l'un des opérandes n'est pas une chaîne de caractères, le langage java a prévu une
traduction de l'opérande qui n'est pas une chaîne de caractères en une chaîne de caractères
représentant celui-ci.
1
1. Création et utilisation d'objets de la classe String
String chaine = 3 + " curieux"; : un des opérandes du signes + est une chaîne de caractères,
l'opérateur + est donc ici l'opérateur de concaténation ; l'int 3 est traduit en une chaîne de caractères
avant d'être concaténé avec " curieux" ; le résultat est une chaîne de caractères, c'est-à-dire en Java un
objet de type String.
void ecrire(String s) : on a déjà défini une méthode ecrire() dans la classe EcritChaine ; on utilise ici
le principe de la surcharge. Il n'y aura pas confusion entre les méthodes ecrire car elles diffèrent par le
jeu de leurs paramètres.
2
2. Quelques méthodes de la classe String
class MethodeChaine {
String r = "essai";
String t = "ESSAI".toLowerCase();
String u = "est";
On obtient à l'exécution :
r == s vaut : true
r == u vaut : false
r.equals(t) vaut : true
r.compareTo(t) vaut : 0
r.compareTo(u) vaut : -1
u.compareTo(r) vaut : 1
3
r == s : la valeur de cette expression, true, montre que les références r et s sont ici égales ; cela est
ainsi car une seule instance de la classe String a été créée pour les deux chaînes de caractères, qui ont
été repérées comme identiques. Il est néanmoins beaucoup plus sûr d'utiliser la méthode equals pour
tester l'égalité de deux chaînes de caractères. Voyez le cas suivant.
r == t : cette expression vaut false ; les variables r et t référencent pourtant deux instances différentes
de la classe String qui contiennent la même chaîne de caractères.
r.equals(t) : cette expression vaut true, ce qui est correct. D'une façon plus générale, il ne faut pas
tester directement, avec "==", l'égalité de deux chaînes de caractères, mais utiliser la
méthode equals comme ici, ou bien la méthode compareTo.
r.compareTo(u) : la méthode compareTo est une méthode d'instance de la classe String ; ici, la
méthode est appliquée à r, qu'on compare à l'objet de type String indiqué dans les parenthèses, c'est-à-
dire à u. La méthode retourne 0 si r et u sont identiques, -1 si r vient avant u dans l'ordre alphabétique,
et 1 si r vient après u.
Exercice 1
Un palindrome est un mot que l'on peut lire dans les deux sens. La distinction entre
majuscules/minuscules n'a aucune importance pour la lecture d'un palindrome. Si on ne tient
pas compte des espaces, des virgules, des tirets et des apostrophes (i.e. les caractères ' ', ',', '-
' et '\''), une phrase complète peut aussi être considérée comme un palindrome. Exemples de
palindromes:
Otto
Elu par cette crapule
Esope reste ici et se repose
Tu l'as trop ecrase, Cesar, ce Port-Salut
A man, a plan, a canal, Panama
Exemples de non-palindromes:
Cours de Java
Le pont de la rivière Kwai
Ecrivez un programme Palindrome.java qui lit une chaine de caractères du clavier et qui teste
s'il s'agit d'un palindrome.
4
Exemple d'exécution:
Entrez un mot ou une phrase : Otto
C'est un palindrome !
Pour ce programme, il convient d'utiliser plusieurs méthodes prédéfinies de la
classe String, comme par exemple charAt(), toLowerCase() et length().
char charAt (int n) : fournit le n ième caractère de la chaîne de l’objet courant.
Une classe en Java peut être insérée dans une autre classe. Ci-dessous, B est une classe
interne à la classe A. Un objet d’une classe interne est associé à l’objet de la classe englobant
l’ayant créé. Un objet interne peut accéder aux attributs et méthodes de l’objet externe associé.
Un objet externe peut accéder aux champs et méthodes de l’objet qu’il a créé.
public class A {
attributs de A // par exemple B b1 = new B() ; B b2 = new B() ;
méthodes de A // les méthodes d’instance (non static) peuvent créer et utiliser des objets de la
classe B
class B {
// classe interne : aucun objet de type B n’est a priori créé lorsqu’on crée un objet de type A.
// un objet de classe B peut être créé dans une méthode de A ou en tant qu’attribut de A.
attributs d’instance de B
méthodes d’instance de B // elles peuvent accéder aux attributs et méthodes de A.
} // class B
} // class A
// A.java
public class A {
int va = 10;
String mot = "bonjour";
B nb = new B(); // objet B (classe interne) attribut de la classe A
A (int va) {
this.va = va;
}
void a1 () {
5
System.out.println ("\n\na1 : creation de objetb1");
B objetb1 = new B(100); // objet de la classe interne.
System.out.println ("a1 : objetb1.vb : " + objetb1.vb); // accès à l’attribut (vb) de objet b1 de la
//classe interne B.
objetb1.b1(); // appel d’une méthode de la classe B.
System.out.println ("\n\na1 : creation de objetb2");
B objetb2 = new B(); // objet de la classe interne
System.out.println ("a1 : objetb2.vb : " + objetb2.vb); // accès à l’attribut (vb) de objetb2 de la
//classe interne B
System.out.println ("*** objet B : objetb2 "+objetb2);
objetb2.b1(); // appel d’une méthode de la classe B
} // a1
void a2 () {
System.out.println ("*** methode a2 ");
} //a2
// classe interne B
public class B {
private int vb = 5; // attribut de la classe interne
B (int vb) {
this.vb = vb;
}
B () {
System.out.println ("*** objet B attribut de la classe A : "+nb);
System.out.println ();
}
void b1 () {
System.out.println (" b1 : mot " + mot + ", va "+ va + ", vb " + vb); // un objet de la classe B
peut accéder à un attribut de A (ex : accès a l’attribut "va" de la classe A)
a2(); // appel d’une méthode de la classe A
}
} // fin de la classe interne B
6
System.out.println("va:"+objeta2.va);
System.out.println("mot:"+objeta2.mot);} // main
} // fin de class A
Résultats d'exécution :
creation de objet a1
*** objet B attribut de la classe A : null
a1 : creation d'objetb1
a1 : objetb1.vb : 100
b1 : mot bonjour, va 10, vb 100
*** methode a2
a1 : creation d'objetb2
*** objet B attribut de la classe A : ClasseInterne_.A$B@15db9742
a1 : objetb2.vb : 5
*** objet B : objetb2 ClasseInterne_.A$B@6d06d69c
b1 : mot bonjour, va 10, vb 5
*** methode a2
creation de objet a2
*** objet B attribut de la classe A : null
a1 : creation d'objetb1
a1 : objetb1.vb : 100
b1 : mot bonjour, va 50, vb 100
*** methode a2
a1 : creation d'objetb2
*** objet B attribut de la classe A : ClasseInterne_.A$B@7852e922
7
a1 : objetb2.vb : 5
*** objet B : objetb2 ClasseInterne_.A$B@4e25154f
b1 : mot bonjour, va 50, vb 5
*** methode a2
nb:ClasseInterne_.A$B@7852e922
va:50
mot:bonjour
Premier exemple
class EssaiJour {
public static void main(String[] arg) {
Jour jour = Jour. LUNDI; // Jour jour = Jour.valueOf(arg[0]);
if (jour == Jour.SAMEDI)
System.out.print("fin de semaine : ");
switch(jour) {
case SAMEDI :
case DIMANCHE :
System.out.println("se reposer");
break;
default :
8
System.out.println("travailler");
break; }
}
}
Résultat d'exécution:
travailler
Les classes pour les types énumérés étendent toujours la classe java.lang.Enum, sans
que cela figure explicitement. En conséquence, puisque Java ne permet pas l'héritage
multiple, une telle classe ne peut pas étendre une autre classe. Les éléments énumérés
ne sont rien d'autres que des instances de la classe enum concernée ; il n'est pas possible
de construire ultérieurement d'autres instances que celles énumérées immédiatement
dans la définition. On peut définir un constructeur comme dans l'exemple ci-dessous.
La classe java.lang.Enum possède des méthodes dont héritent les types énumérés ; en
particulier, la méthode toString renvoie le nom de l'item.
Second exemple
JourPlus(int nb) {
nbHeures = nb; }
9
switch(this) {
case SAMEDI : return " se reposer";
case DIMANCHE : return "sport et loisir";
default : return "travailler"; }
}
}
class EssaiJourPlus {
public static void main(String[] arg) {
JourPlus unJour = JourPlus.SAMEDI; //Jour jour = Jour.valueOf(arg[0]);
System.out.println("numero de " + unJour + " : " + unJour.ordinal());
System.out.println();
System.out.println(unJour + " : " + unJour.action());
System.out.println();
public enum Jour : il s'agit de l'en-tête de la classe ; le mot réservé enum est obligatoire et Jour est le
nom du type énuméré.
10
Jour.valueOf(arg[0]) : renvoie l'objet de l'énumération dont le nom est donné en argument sous
forme d'une chaîne de caractères.
jour == Jour.SAMEDI : SAMEDI s'utilise comme une constante statique de type Jour ; d'autre part,
on peut toujours comparer comme ici des valeurs de types énumérés avec == sans faire appel à la
méthode equals.
switch(jour) : l'instruction switch est possible avec un type énuméré, comme le montre l'exemple.
SAMEDI : dans l'instruction switch , les items de type Jour sont obligatoirement indiqués directement,
sans mettre par exemple Jour.SAMEDI.
public JourPlus(int nb) : on peut définir un constructeur. Lorsqu'on déclare la liste énumérée, on doit
alors mettre des arguments destinés au(x) constructeur(s), comme on le voit sur l'exemple.
unJour.ordinal() : la méthode ordinal est une méthode définie dans la classe java.lang.Enum et qui
renvoie le numéro d'ordre dans l'énumération, en commençant à la valeur 0.
for (JourPlus jour : JourPlus.values()) : on remarque ici une façon de définir la boucle for pour un
type énuméré ; la variable jour prend successivement toutes les valeurs énumérées dans le
type JourPlus.
11
IV. LA CLASSE SCANNER
ScannerDemo.java
/* programme de démonstration de la classe Scanner qui fournit des méthodes de lecture
au clavier simples pour les types de données de base les plus courants.
*/
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("entrez une chaine de caractères : ");
String s = sc.next();
System.out.println("chaine lue : " + s);
12
boolean b = sc.nextBoolean();
System.out.println("booleen lu : " + b);
IV. LA RÉCURSIVITÉ
Le langage Java comme C ou C++ gère la récursivité des fonctions. Une fonction peut
s’appeler elle-même pour opérer sur de nouveaux paramètres. La fonction doit comporter un
test d’arrêt (des appels récursifs) qu’il est conseillé de mettre en début de fonction.
Les boucles récursives
Une boucle peut aussi s’écrire sous forme récursive. On recommence (appel récursif) le
corps de la boucle tant qu’on n’a pas atteint la valeur limite de sortie de la boucle. La boucle
est croissante ou décroissante suivant que l’écriture (l’action de la boucle) est faite avant ou
après l’appel récursif.
// BouclesRecursives.java
class BouclesRecursives {
static void boucleDecroissante (int n) {
if (n > 0) {
System.out.println ("boucleDecroissante valeur de n : " + n);
boucleDecroissante (n-1);
}
}
static void boucleCroissante (int n) {
if (n > 0) {
boucleCroissante (n-1);
System.out.println ("boucleCroissante valeur de n : " + n);
}
}
public static void main (String[] args) {
boucleDecroissante (5);
13
System.out.println ("\n");
boucleCroissante (5);
}
} // class BouclesRecursives
Résultats d’exécution :
boucleDecroissante valeur de n : 5
boucleDecroissante valeur de n : 4
boucleDecroissante valeur de n : 3
boucleDecroissante valeur de n : 2
boucleDecroissante valeur de n : 1
boucleCroissante valeur de n : 1
boucleCroissante valeur de n : 2
boucleCroissante valeur de n : 3
boucleCroissante valeur de n : 4
boucleCroissante valeur de n : 5
Exercice 2
Ecrivez un programme Java qui calcul le factorielle de n : "Calcul récursif et itératif de la
factorielle de n".
Pour calculer n! (factorielle n), on peut utiliser deux formules différentes :
1- La formule itérative :
n! = 1 * 2 * 3 * ... * n
2- La formule récursive définissant n! en fonction de (n-1)! :
0! (factorielle de zéro) = 1
pour tout entier n>0, n! = n * (n-1)!
14
Exemple de déroulement
15