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