en JAVA - igt.net

publicité
Liste linéaire chaînée avec Java :
En tenant compte du temps consacré à cette matière (environ deux heures seulement), de
la nature de notre cours IFT 1170 qui est très orientée objet, on décide de montrer les
listes linéaires chaînées en utilisant la classe prédéfinie LinkedList du Java. En espérant
que c’est une bonne occasion aux étudiants du IFT 1170 de revoir les concepts vus en
classe à travers les schémas, on va donner des exemples avec la classe LinkedList. Notez
que VJ++ (avec la version 1.1 de Java) ne supporte pas LinkedList . Dans les exemples
on utilise l’environnement de JDK pour compiler et exécuter.
Sous JDK :
Programme
source
en JAVA
Liste.java
compilateur
bytecode
JAVA
javac Liste.java
Liste.class
La compilation du programme Liste.java pour
fabriquer la version en bytecode Liste.class
bytecode
Interpréteur JAVA =
Liste.class
Machine virtuelle Java +
Bibliothèque de classes
(API)
Résultats
(excécution)
du
programme
java Liste
L
L’interprétation du bytecode Liste.java
pour founir des résultats (l’exécution)
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
170
La classe LinkedList du paquet java.util
java.lang.Object
|
+-java.util.AbstractCollection
|
+-java.util.AbstractList
|
+-java.util.AbstractSequentialList
|
+-java.util.LinkedList
super classe en
Java
AbstractSequentialList
interface
interface
interface
List
Cloneable
Serializable
public class LinkedList
extends AbstractSequentialList
implements List, Cloneable, Serializable
Pour utiliser la classe LinkedList., on importe le paquet java.util :
import java.util.*;
Constructor Summary : sommaire de constructeurs
LinkedList()
Constructs an empty list : construire une liste linéaire vide.
etc….
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
171
Method Summary : résumé de quelques méthodes de gestion d’une liste
Ajout d’un élément à une liste :
void add(int index, Object element)
Inserts the specified element at the specified position in this list.
Insérer un élement à un indice donné de la liste.
boolean add(Object o)
Appends the specified element to the end of this list.
Insérer un objet à la fin de la liste.
void addFirst(Object o)
Inserts the given element at the beginning of this list.
Insérer un objet au début de la liste.
void addLast(Object o)
Appends the given element to the end of this list.
Insérer un objet à la fin de la liste.
Accès à un élément de la liste :
Object get(int index)
Returns the element at the specified position in this list.
Retourner l’élément à un indice spécifique de la liste.
Object getFirst()
Returns the first element in this list.
Retourner le premier élément de la liste.
Object getLast()
Returns the last element in this list.
Retourner le dernier élément de la liste.
La taille de la liste (son nombre d’éléments) : utile pour le parcours
Int size()
Returns the number of elements in this list.
Retourner le nombre d’élements de la liste
Modification d'un élément de la liste :
Object set(int index, Object newElem)
Replaces the element at the specified position in this list with the
specified element :
Remplacer l’élément à l’indice par un nouvel.
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
172
Recherche dans une liste : (basée sur la redéfinition de equals)
boolean contains(Object o)
Returns true if this list contains the specified element.
Retourner VRAI si la liste contient l’objet.
int indexOf(Object o)
Returns the index in this list of the first occurrence of the specified
element, or -1 if the List does not contain this element.
Retourner l’indice de la première occurence de l’objet de la
liste ou -1 si la liste ne contient pas l’objet.
int lastIndexOf(Object o)
Returns the index in this list of the last occurrence of the specified
element, or -1 if the list does not contain this element.
Retourner l’indice de la dernière occurence de l’objet de la
liste ou -1 si la liste ne contient pas l’objet.
Suppression d’un élément de la liste :
Object remove(int index)
Removes the element at the specified position in this list.
Supprimer l’élément à tel indice.
boolean remove(Object o)
Removes the first occurrence of the specified element in this list.
Supprimer l’objet (la première occurrence trouvée).
Object removeFirst()
Removes and returns the first element from this list.
Supprimer et retourner le premier élément de la liste.
Object removeLast()
Removes and returns the last element from this list.
Supprimer et retourner le dernier élément de la liste.
etc. . .
etc
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
173
Parcourir une liste :
1) Manière simple :
for ( int i = 0 ; i < liste.size() ; i++)
{
classe objet = ( . . . conversion . . .) liste.get(i) ;
. . . traiter l’objet . . .
}
2) Utilisation d’un itérateur (style de C++) :
public interface Iterator
Method Summary
boolean hasNext()
Returns true if the iteration has more elements.
(avoir encore d’éléments)
Object next()
Returns the next element in the iteration.
(retourner le prochain élément).
public interface ListIterator
extends Iterator
Method Summary : quelques méthodes
boolean hasNext()
Returns true if this list iterator has more elements when traversing the
list in the forward direction.
Retourner VRAI si l’itérateur a encore d’éléments (suivants).
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
174
boolean hasPrevious()
Returns true if this list iterator has more elements when traversing the
list in the reverse direction.
Retourner VRAI si l’itérateur a encore d’éléments (avants)
Object next()
Returns the next element in the list.
Retourner l’élément suivant de la liste.
Object previous()
Returns the previous element in the list.
Retourner l’élément précédent de la liste.
etc … etc …
a) parcours du premier au dernier élément de la liste:
ListIterator iterateur = liste.listIterator();
while(iterateur.hasNext())
{
classe objet = ( . . . conversion . . .) iterateur.next() ;
. . . traiter l’objet . . .
}
b) parcours du dernier au premier élément de la liste (sans inverse)
ListIterator iterateur = liste.listIterator( liste.size());
while(iterateur.hasPrevious())
{
classe objet = ( . . . conversion . . .) iterateur.previous() ;
. . . traiter l’objet . . .
}
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
175
Exemple : gestion d’une liste linéaire des diviseurs
de 720
/**
* Fichier Liste1.java
* À exécuter sous JDK
* (pas sous VJ++ qui provoque l'erreur suivante:
* Nom "LinkedList" non défini (à cause de la version 1.1 du
* VJ++)
*
* Démontration d'utilisation de la classe java.util.LinkedList
*
* (Voir l'exécution et les notes de cours pour comprendre et
* pour les explications supplémentaires)
*
*/
import java.util.*;
public class Liste1
{
// créer la liste linéaire des diviseurs (Integer) d'un nombre
static LinkedList creerListe(int nombre) {
LinkedList uneListe = new LinkedList(); // liste VIDE au début
for (int candi = 1 ; candi <= nombre ; candi++)
if (nombre % candi == 0)
uneListe.addLast( new Integer (candi) );
return uneListe;
}
// une manière de parcourir une liste linéaire:
static void afficher(LinkedList liste, String message) {
System.out.println("\nContenu " + message);
for (int i = 0 ; i < liste.size() ; i++)
{ int valeur = ((Integer) liste.get(i)).intValue();
System.out.println((i+1) + ")\t" + valeur);
}
System.out.println();
}
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
176
// une autre manière de parcourir une liste linéaire dans 2 sens
static void afficher(String message, LinkedList liste, int ordre) {
System.out.println("\nContenu " + message);
int rang = 0;
if(ordre == 1){
System.out.println("Du debut a la fin");
ListIterator versAvant = liste.listIterator();
while(versAvant.hasNext())
System.out.print(++rang + ")\t" + versAvant.next()+ "\n");
}
else {
System.out.println("En ordre inverse");
ListIterator inverse = liste.listIterator(liste.size());
while(inverse.hasPrevious())
System.out.print(++rang + ")\t" + inverse.previous() + "\n");
}
System.out.println();
}
// démo de qq méthodes fréquemment utilisées pour gérer une liste
static void demo(LinkedList liste) {
System.out.println("Contenu de la liste de " + liste.size() +
" elements :\n" + liste);
System.out.println("\nPremier element : " + liste.getFirst());
System.out.println("Dernier element : " + liste.getLast());
System.out.println("\nResultats de la recherche :\n");
System.out.println(" a) de 15 :\n");
System.out.println(" avec indexOf : " + liste.indexOf(new Integer(15)));
System.out.println(" avec lastIndexOf : " + liste.lastIndexOf(new Integer(15)));
System.out.println(" avec contains : " + liste.contains(new Integer(15)));
System.out.println(" b) de 1000 :\n");
System.out.println(" avec indexOf : " + liste.indexOf(new Integer(1000)));
System.out.println(" avec lastIndexOf : " + liste.lastIndexOf(new Integer(1000)));
System.out.println(" avec contains : " + liste.contains(new Integer(1000)));
liste.addFirst( new Integer(1234) );
liste.addLast ( new Integer(333) );
liste.add(1, new Integer(543));
liste.set(2, new Integer(9999));
System.out.println("Contenu de la liste de " + liste.size() +
" elements :\n" + liste);
System.out.println("\nDeuxieme element de la liste : " +
liste.get(1));
System.out.println("\nTroisieme element de la liste : " +
liste.get(2));
liste.remove(liste.size() - 1);
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
177
liste.remove(3);
System.out.println("Contenu de la liste (avec toString) de " + liste.size() +
" elements :\n" + liste);
afficher(liste," (avec une maniere de parcourir la liste) :");
afficher(" (avec une autre maniere de parcourir la liste) :", liste, 1);
afficher(" (avec une autre maniere de parcourir la liste) :", liste, 2);
}
public static void main (String[] args)
{
LinkedList liste = creerListe(720);
demo(liste);
}
}
/* Exécution sous JDK :
R:\ListeLineaire>javac Liste1.java
R:\ListeLineaire>java Liste1
Contenu de la liste de 30 elements :
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 45, 48, 60, 72,
80, 90, 120, 144, 180, 240, 360, 720]
Premier element : 1
Dernier element : 720
Resultats de la recherche :
a) de 15 :
avec indexOf : 10
avec lastIndexOf : 10
avec contains : true
b) de 1000 :
avec indexOf : -1
avec lastIndexOf : -1
avec contains : false
Contenu de la liste de 33 elements :
[1234, 543, 9999, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 4
5, 48, 60, 72, 80, 90, 120, 144, 180, 240, 360, 720, 333]
Deuxieme element de la liste : 543
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
178
Troisieme element de la liste : 9999
Contenu de la liste (avec toString) de 31 elements :
[1234, 543, 9999, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 45,
48, 60, 72, 80, 90, 120, 144, 180, 240, 360, 720]
Contenu (avec une maniere de parcourir la liste) :
1)
1234
2)
543
3)
9999
4)
3
5)
4
6)
5
7)
6
8)
8
9)
9
10) 10
11) 12
12) 15
13) 16
14) 18
15) 20
16) 24
17) 30
18) 36
19) 40
20) 45
21) 48
22) 60
23) 72
24) 80
25) 90
26) 120
27) 144
28) 180
29) 240
30) 360
31) 720
Contenu (avec une autre maniere de parcourir la liste) :
Du debut a la fin
1)
1234
2)
543
3)
9999
4)
3
5)
4
6)
5
7)
6
8)
8
9)
9
10) 10
11) 12
12) 15
13) 16
14) 18
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
179
15)
16)
17)
18)
19)
20)
21)
22)
23)
24)
25)
26)
27)
28)
29)
30)
31)
20
24
30
36
40
45
48
60
72
80
90
120
144
180
240
360
720
Contenu (avec une autre maniere de parcourir la liste) :
En ordre inverse
1)
720
2)
360
3)
240
4)
180
5)
144
6)
120
7)
90
8)
80
9)
72
10) 60
11) 48
12) 45
13) 40
14) 36
15) 30
16) 24
17) 20
18) 18
19) 16
20) 15
21) 12
22) 10
23) 9
24) 8
25) 6
26) 5
27) 4
28) 3
29) 9999
30) 543
31) 1234
*/
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
180
‘5’
‘12’
‘4’
“espagne”
“panama”
“australie ”
“madrid”
“ panama”
“canberra”
505 000 km2
77 000 km2
7 700 000 km2
40 millions habitants
2 400 000 habitants
16 800 000 habitants
premier
courant
3
nbElem
liste
dernier
Schéma d’une liste des pays
IFT 1170, Hiver 2005
Chapitre 10 : Liste linéaire chaînée avec la classe LinkedList
181
Téléchargement