Mise en œuvre des. Mise en œuvre des listes. Interface List. Interface Iterator. Pratique de la programmation orientée-objet Michel Schinz

Documents pareils
Package Java.util Classe générique

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Chapitre V. Les classes : Object, Vector, etc.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

4. Groupement d objets

Programmation Orientée Objet

Java Licence Professionnelle CISII,

Programmation Par Objets

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Utilisation d objets : String et ArrayList

Une introduction à Java

ACTIVITÉ DE PROGRAMMATION

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmer en JAVA. par Tama

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Initiation à la programmation en Python

Introduction. Les méthodes. Les méthodes. Identité et égalité. Identité et égalité. La copie d'objets. Identité et égalité.

Introduction à JDBC. Accès aux bases de données en Java

1. Langage de programmation Java

Manuel d'utilisation de l'administration du site Japo.ch - 1

Java DataBaseConnectivity

LOSLIER Mathieu. Filière Informatique et Réseau 1 ère année. TP DNS. Responsable : LOHIER Stephane. Chargé de TD : QUIDELLEUR Aurélie

Logical Volume Manager (LVM)

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

TD3: tableaux avancées, première classe et chaînes

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmation Objet II

UE C avancé cours 1: introduction et révisions

RMI le langage Java XII-1 JMF

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Systeme d'exploitation

Programme Compte bancaire (code)

Map-Reduce : un cadre de programmation parallèlle pour l analyse de grandes données. Stéphane Genaud ENSIIE

Java 1.5 : principales nouveautés

Généralités sur le Langage Java et éléments syntaxiques.

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Flux de données Lecture/Ecriture Fichiers

Accès aux bases de données

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

IRL : Simulation distribuée pour les systèmes embarqués

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Méthodologies de développement de logiciels de gestion

Certificat Big Data - Master MAthématiques

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmation Objet I

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Cours Microfer Chartres

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Présentation du PL/SQL

Projet de programmation (IK3) : TP n 1 Correction

Cours Informatique Master STEP

GOL502 Industries de services

Application 1- VBA : Test de comportements d'investissements

Programmation Objet - Cours II

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Algorithme des fourmis appliqué à la détection et au suivi de contours dans une image

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Introduction à MapReduce/Hadoop et Spark

Sommaire. 2 LINQ to Objects

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

ITIL Gestion de la capacité

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Le hub d entreprise est une application de déploiement des applications mais aussi un outil de communication

TP Programmation Java / JDBC / Oracle

Algorithmique et structures de données I

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Questionnaire Assurance Responsabilité Civile Professionnelle Promoteurs (Partie courtier)

LE TABLEUR OPENOFFICE CALC : CONTRÔLES DE FORMULAIRES ACCÈS AUX BASES DE DONNÉES

Recherche dans un tableau

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Construire des plug-ins pour SAS Management Console SAS 9.1

REALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Gestion distribuée (par sockets) de banque en Java

Cours Composant 2. Qualité logicielle et spécications algébriques

PHP. PHP et bases de données

Exercices sur les interfaces

I. Introduction aux fonctions : les fonctions standards

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Chapitre 2 Devine mon nombre!

Propagation sur réseau statique et dynamique

TDB-SSI LES EXTENSIONS

Bases de données. Table des matières. Introduction. (ReferencePlus.ca)

Approche Contract First

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Modélisation et simulation du trafic. Christine BUISSON (LICIT) Journée Simulation dynamique du trafic routier ENPC, 9 Mars 2005

TP1 : Initiation à Java et Eclipse

TAGREROUT Seyf Allah TMRIM

Projet gestion d'objets dupliqués

Java Licence professionnelle CISII,

Transcription:

Mise en œuvre des listes Mise en œuvre des listes Pratique de la programmation orientée-objet Michel Schinz 2014-03-17 Nous allons examiner deux mises en œuvre simplifiées des listes, similaires à celles offertes par la bibliothèque Java, à savoir : 1. les tableaux-listes, mis en œuvre par la classe ArrayList, 2. les listes chaînées, mises en œuvre par la classe LinkedList. 1 2 Interface List Interface Iterator L'interface List implémentée par nos mises en œuvre est une simplification de celle de l'api Java. Elle contient toutefois les méthodes les plus importantes. public interface List<E> { boolean isempty(); int size(); void add(e newelem); void remove(int i); E get(int i); void set(int i, E newelem); Iterator<E> iterator(); } L'interface Iterator implémentée par nos mises en œuvre des itérateurs est, quant à elle, identique à celle de l'api Java : public interface Iterator<E> { boolean hasnext(); E next(); void remove(); } 3 4

Tableau-liste Tableau-liste Un tableau-liste est une liste dont les éléments sont stockés dans un tableau, que nous appellerons tableau sous-jacent. La capacité d'un tableau-liste est la taille de son tableau sous-jacent. Il s'agit du nombre d'éléments que le tableauliste peut stocker sans qu'il soit nécessaire de redimensionner (par copie) son tableau sous-jacent. 6 tableau sous-jacent Tableau-liste taille "lundi" "mardi" "mercredi" "jeudi" "vendredi" capacité Création A sa création, un tableau-liste est équipé d'un tableau sousjacent de petite taille, la capacité initiale, non nulle. Il peut être judicieux d'offrir la possibilité de spécifier la capacité initiale lors de la création. 7 8

Création Redimensionnement 0 capacité initiale Lorsque toute la capacité du tableau sous-jacent a été utilisée et que de nouveaux éléments doivent être ajoutés au tableau-liste, il est nécessaire de «redimensionner» le tableau sous-jacent. Cela se fait par création d'un nouveau tableau sous-jacent, dans lequel les éléments de l'ancien sont copiés. La taille du nouveau tableau sous-jacent est un multiple de celle de l'ancien, p.ex. le double, afin de pouvoir amortir le coût de la copie sur plusieurs opérations d'insertion. 9 10 Redimensionnement Insertion 4 L'insertion d'un élément dans un tableau-liste peut demander un redimensionnement préalable si la capacité du tableau sous-jacent est totalement utilisée. Une fois l'éventuel redimensionnement fait, il faut faire une place pour le nouvel élément en décalant vers le haut tous ceux d'indice supérieur à l'indice d'insertion, puis mettre le nouvel élément à sa place. 11 12

Insertion Suppression 6 "e" "x" La suppression d'un élément d'un tableau-liste se fait par décalage vers le bas de tous les éléments d'indice supérieur à l'élément à supprimer. Cela fait, il faut effacer l'élément désormais inutilisé du tableau sous-jacent, pour éviter de conserver une référence inutilisée à un objet. 13 14 Suppression "x" 6 "e" Itération Un tableau-liste est à accès aléatoire, c-à-d qu'il est possible d'obtenir un élément étant donné son index en O(1). Cette caractéristique rend la mise en œuvre d'un itérateur sur un tableau-liste très simple, puisqu'il suffit de stocker une référence vers le tableau-liste et l'index du prochain élément. La méthode next de l'itérateur utilise la méthode get du tableau-liste pour obtenir le prochain élément, puis incrémente l'index. 1 16

ArrayListIterator<String> tableauliste 0 prochain index Itération "lundi" "mardi" "mercredi" "jeudi" "vendredi" Exercice (en classe) Ecrivez la classe ArrayList. 17 18 Liste chaînée Liste chaînée Une liste chaînée stocke ses éléments dans des nœuds (un par élément) qui sont chaînés entre-eux. Une liste est simplement chaînée si chaque nœud ne possède une référence que vers l'un de ses voisins, et doublement chaînée si chaque nœud possède une référence vers ses deux voisins. Elle est circulaire si le premier et le dernier nœud sont chaînés entre-eux. Pour faciliter la programmation, une liste chaînée peut être équipée d'un nœud d'en-tête qui ne stocke aucun élément mais garantit la présence d'un nœud dans la liste. 19 20

Liste chaînée (Liste doublement chaînée circulaire avec nœud d'en-tête) Création tête taille A sa création, une liste chaînée (doublement et avec nœud d'en-tête) ne possède aucun autre nœud que celui d'entête. nœud d'en-tête "lundi" "mercredi" "vendredi" "mardi" "jeudi" 21 22 Création Insertion 0 L'insertion d'un élément dans une liste chaînée se fait par création d'un nouveau nœud le référençant et par chaînage de celui-ci. Dans une liste doublement chaînée circulaire avec nœud d'en-tête, l'existence d'un successeur et d'un prédécesseur au nouveau nœud est garantie, rendant l'insertion particulièrement simple à mettre en œuvre. De plus, la présence d'un nœud d'en-tête garantit que la référence vers la tête de liste ne change jamais, même en cas d'insertion en première position. 23 24

Insertion Suppression 4 La suppression d'un élément d'une liste chaînée se fait par dé-chaînage de son nœud, c-à-d par ajustement des liens de ses voisins. Le chainage double circulaire garantit l'existence de ces deux voisins, et la présence d'un nœud d'en-tête garantit que la référence vers la tête de la liste ne doit jamais être changée, même en cas de suppression du premier élément. Ces caractéristiques rendent la suppression très simple. "x" 2 26 Suppression Itération 4 "x" Contrairement aux tableaux-listes, les listes chaînées ne doivent pas être parcourues au moyen d'un index et de la méthode get, pour des raisons de performance. Un itérateur de liste chaînée doit donc avoir connaissance des nœuds. Il possède une référence vers le nœud d'entête et une vers le prochain nœud de l'itération. La méthode next extrait (puis retourne) la valeur associée au prochain nœud, tout en avançant la référence vers son successeur. L'itération est terminée lorsque le prochain nœud est celui d'en-tête. 27 28

Itération Exercice (en classe) en-tête LinkedListIterator<String> prochain nœud Ecrivez la classe LinkedList. "lundi" "mercredi" "vendredi" "mardi" "jeudi" 29 30 Boucle for-each Itération par boucle for-each Comme nous l'avons vu, la boucle for-each en Java est traduite en utilisation d'itérateurs. Logiquement, Java offre la possibilité d'utiliser la boucle foreach pour toute collection que l'on peut parcourir au moyen d'un itérateur. Il faut toutefois que ce soit un itérateur Java, c-à-d qu'il ait le type java.util.iterator. Cette contrainte est exprimée par l'interface Iterable, qui doit être implémentée par toute collection que l'on désire pouvoir parcourir au moyen de la boucle for-each. 31 32

Interface Iterable Listes itérables L'interface java.lang.iterable ne déclare que la méthode iterator, qui permet d'obtenir un itérateur de type java.util.iterator sur la collection à laquelle on l'applique. Bien entendu, Iterable est générique, son paramètre de type donnant le type des éléments de la collection à parcourir. public interface Iterable<E> { public Iterator<E> iterator(); } Pour rendre nos listes «itérables» au moyen de la boucle for-each, il suffit donc d'utiliser l'interface Iterator de java.util plutôt que la nôtre, et de faire implémenter à notre interface List l'interface Iterable : public interface List<E> implements Iterable<E> { } On peut ensuite les parcourir au moyen de la boucle foreach, p.ex. : List<String> l = ; for (String e: l) System.out.println(e); 33 34