Vous êtes sur la page 1sur 4

L2 anne 2015-2016

TD 5 -POO et langage JAVA

Les tableaux dynamiques - ArrayList


1.La classe ArrayList
Un programme a souvent besoin de pouvoir grer une suite dlments (la liste des produits
commands par un internaute, les cartes dans un paquet, les figures dun dessin). Dans de
nombreux cas, la taille de cette suite dlments va varier tout au long du programme. La
liste des rfrences des produits commands par un internaute augmentera chaque produit
command, et diminuera quand lutilisateur dcidera de retirer un produit de sa commande.
Une premire approche serait dutiliser un tableau :
String [ ] commandeReferences;
Cest possible, mais pas trs simple mettre en uvre : la taille dun tableau ne peut plus
varier une fois quil a t cr. Pour commander un nouveau produit, il faudrait donc :
1. crer un nouveau tableau, plus grand ;
2. copier lancien tableau dans le nouveau ;
3. ajouter le nouvel lment ;
4. faire pointer la variable dorigine vers le nouveau tableau.
Soit en gros le code suivant :
String nouveauProduit= ......... ;
String [ ] tmp= new String [commandeReferences.length + 1];
for (int i= 0; i < commandeReferences.length; i++) {
tmp[i]= commandeReferences[i];
}
// ajout du nouveau produit dans la dernire case
tmp[tmp.length - 1]= nouveauProduit;
// la variable qui dsigne la commande doit pointer sur le
// nouveau tableau :
commandeReferences= tmp;
Il faudrait, de la mme manire, crire le code ncessaire pour supprimer un lment, en
rechercher un, etc...
Comme ce type de problme est rcurrent en informatique, JAVA, comme la plupart des
langages de programmation, fournit les classes ncessaires dans ses bibliothques
standards. Nous allons tudier la plus simple, la classe ArrayList.
La classe ArrayList permet donc de construire des tableaux de taille variable. De la mme
manire quun tableau est un tableau dint, de char, de String (etc.), une ArrayList contient
des valeurs dun type donn. On doit prciser ce type quand on dclare la variable. Pour
cela, on fait suivre le nom de la classe ArrayList par le type des lments, entre chevrons (<
et >). Par exemple :
ArrayList<String> maListe; dclare la variable maListe comme tant une rfrence vers une
ArrayList de Strings.
Une ArrayList est un objet, et comme les tableaux, les objets sont crs par lexcution de
linstruction new. Nous verrons plus tard les dtails. Pour linstant, il suffit de comprendre que
maListe= new ArrayList<String>(); va crer une ArrayList vide.
Pour des raisons sur lesquelles nous reviendront plus tard, les ArrayList destines contenir
1

des entiers ou des nombres rels se dclarent respectivement comme ArrayList<Integer> et


ArrayList<Double>
Enfin, notez que pour quune classe puisse utiliser les ArrayList, il faut crire
import java.util.ArrayList; avant la dclaration de votre
classe dans le fichier java :
import java.util.ArrayList;
public class MaClasse {
...
}
2. Utilisation
Les objets se manipulent essentiellement travers des mthodes. Les mthodes sont des
procdures ou des fonctions qui sont appeles sur lobjet. Par exemple, la mthode
size(), qui est une fonction, retourne la longueur dune ArrayList. On pourra lappeler de la
manire suivante :
int long= maListe.size();
En rgle gnrale, pour appeler une mthode m sur un objet o, on crit o.m(). Donc, dans
notre exemple, on appelle la mthode size sur lobjet maListe.
La liste des mthodes disponible pour un objet donn est fixe, et dpend du type (plus
exactement de la classe) de lobjet. Notre objet maListe est de classe ArrayList, il dispose
donc des mthodes dArrayList. La liste des mthodes dune classe fait partie de la
documentation de celle-ci, et explicite ce quil est possible de faire avec un objet de la classe
en question.
Nous allons donc examiner quelques unes des mthodes disponibles sur les ArrayList.1,
pour ngliger un certain nombre de problmes quil est un peu tt pour aborder.
Lapproximation que nous faisons est bien videmment compatible avec la vraie
spcification.
Les mthodes qui suivent permettent dobtenir la mme chose quavec un tableau normal,
mais en gagnant, en plus, la possibilit dajouter une nouvelle case, ou de supprimer une
case existante.
Dans le texte qui suit, Type correspond au type des lments de lArrayList. Pour une
ArrayList de String, par exemple, on remplacera Type par String int size() : fonction qui
renvoie la longueur dune ArrayList; La fonction boolenne isEmpty permet de savoir si une
liste est vide.
Type get(int i) renvoie lentre de la case numro i. Comme pour les tableaux, les cases des
ArrayList sont numrotes en commenant 0. Le type de lobjet retourn est celui prcis
lors de la cration de lArrayList. Pour nous ce sera donc String, Double ou Integer.
La fonction suivante permet donc de calculer la somme des lments dune ArrayList
dentiers :
public static int somme(ArrayList<Integer> liste) {
int s=0;
for (int i= 0; i < liste.size(); i++)
s= s + liste.get(i);
return s;
}
2

add(Type element) ajoute un lment la fin de la liste.


Pour construire la liste [2,3,5, 7, 11], on crira donc :
ArrayList<Integer> l= new ArrayList<Integer>();
l.add(2); l.add(3); l.add(5);
l.add(7); l.add(11);
Notez quen toute rigueur, add prend un argument du type prcis lors de la cration de
lArrayList, cest-`a-dire Integer dans notre cas. Il faudrait donc crire :
l.add(new Integer(2));
l.add(new Integer(3));
// etc...
Cependant, pour simplifier la vie des programmeurs, java 1.5 a introduit un systme de
conversion automatique entre les types de base int, double, char, boolean et les classes
correspondantes (Integer, Double, Character et Boolean.
set(int i, Type element) remplace lancienne valeur qui tait dans la case i par element.
Logiquement, i doit tre infrieure la size() de lArrayList.
remove(int i) supprime llment qui est dans la case i ;
remove(Type element) supprime la premire occurrence de llment de valeur element 2 ;
si llment est prsent plusieurs fois, il ne sera enlev quune seule fois. Le contenu des
cases est dcal, et la longeur de lArrayList diminue de 1. Si llment nest pas prsent, la
liste nest pas modifie.
Et un peu plus
La classe ArrayList est trs riche. Voyons donc quelques mthodes supplmentaires.
boolean contains(Type element) renvoie vrai si la liste contient la valeur element.
int indexOf(Type element) renvoie la position de element dans la liste, et -1 sil ny apparat
pas.
add(int i, Type element) ajoute la valeur element la position i. i doit tre infrieure ou gale
size() (pourquoi infrieure ou gale et non pas simplement infrieure stricte comme pour
get ?). La fin du tableau est dcale (lancien lment en position i passe en position i + 1,
etc.)
clear() vide la liste.
addAll(ArrayListType l1) lappel l1.addAll(l2) ajoute tous les lments de l2 la fin de l1
(concatne donc l1 et l2. l1 est modifie, l2 ne lest pas.
retainAll lappel l1.
retainAll(l2) enlve tous les lments de l1 qui ne sont pas dans l2.
removeAll lappel l1.removeAll(l2) enlve tous les lments de l1 qui sont dans l2.
Aprs lappel, il ne reste plus dlment de l2 dans l1.
3

3. Un petit exemple
A titre dexemple voici un petit programme qui simule une caisse enregistreuse. On peut
diter le ticket de caisse dun client en y ajoutant des produits ou en les supprimant. Dans
ltat actuel de nos connaissances, nous avons reprsent le ticket par deux ArrayList. La
premire contient les noms des produits achets, et la seconde contient leur prix.
import java.util.ArrayList ;
/// Une simulation de caisse enregistreuse .
public class Caisse {
public static void main ( String args [ ] ) {
Scanner in = new Scanner(System.in);
ArrayList<String> nomsArticles= new ArrayList<String >( ) ;
ArrayList<Double> prixArticles = new ArrayList<Double >( ) ;
boolean fin = false ;
while ( ! fin ) {
System.out.println( votre choix : ) ;
System.out.println( 1 : ajouter un article ) ;
System.out.println( 2 : supprimer un article ) ;
System.out.println( 3 : terminer et afficher le total ) ;
int rep= in.nextInt();
if ( rep == 1 ) { / / ajout d un prodouit
System.out.print( nom de larticle : ) ;
String nom= in.nextLine();
System.out.print( prix de larticle : ) ;
double prix = in.nextDouble();
nomsArticles.add ( nom ) ;
prixArticles.add ( prix ) ;
afficherTicket(nomsArticles, prixArticles ) ;
} else if ( rep == 2 ) {
/ / suppression du produit dans la case i .
afficherTicket( nomsArticles , prixArticles ) ;
System.out.print( numro de larticle enlever ) ;
int i = in.nextInt();
/ / on supprime le produit dans les deux Array List.
nomsArticles.remove ( i ) ;
prixArticles.remove ( i ) ;
System.out.println( Ticket aprs suppression ) ;
afficherTicket(nomsArticles, prixArticles ) ;
} else fin = t rue ;
}
System.out.println( Ticket final ) ;
afficherTicket( nomsArticles , prixArticles ) ;
/ / calcul du prix
double total = 0 ;
for ( int i = 0 ; i < prixArticles.size( ) ; i ++)
total = total + prixArticles.get( i ) ;
System.out.println( Total + total ) ;
}
public static void afficherTicket( ArrayList<String > noms , ArrayList<Double> prixArticles )
{
for ( int i = 0 ; i < noms.size( ) ; i ++) {
System.out.println( i + . + noms.get( i )+ prix : + prixArticles.get( i ) ) ;
}
}
}
4

Vous aimerez peut-être aussi