Chapitre 10. Les interfaces Comparable et Comparator 1



Documents pareils
RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

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

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

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

Utilisation d objets : String et ArrayList

Une introduction à Java

Programmer en JAVA. par Tama

Package Java.util Classe générique

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

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation par les Objets en Java

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

Programmation Par Objets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Projet de programmation (IK3) : TP n 1 Correction

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 )

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

Programmation Orientée Objet Java

Programmation Objet I

Corrigés des premiers exercices sur les classes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence Professionnelle CISII,

Corrigé des exercices sur les références

Héritage presque multiple en Java (1/2)

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

RMI le langage Java XII-1 JMF

Exercices sur les interfaces

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Auto-évaluation Programmation en Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Programmation Objet II

Objets et Programmation. origine des langages orientés-objet

Tp 1 correction. Structures de données (IF2)

PROGRAMMATION PAR OBJETS

Recherche dans un tableau

as Architecture des Systèmes d Information

Programmation avec des objets : Cours 7. Menu du jour

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Langage Java. Classe de première SI

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

TD/TP PAC - Programmation n 3

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation Objet - Cours II

TD/TP PAC - Programmation n 3

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

INF 321 : mémento de la syntaxe de Java

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

Cours 1: Java et les objets

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

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

Programme Compte bancaire (code)

TP1 : Initiation à Java et Eclipse

Chapitre 2. Classes et objets

INITIATION AU LANGAGE JAVA

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

Java 1.5 : principales nouveautés

Apprendre Java en 154 minutes

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Applet pour visualiser les variables «automate» notifiées

Un ordonnanceur stupide

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

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

1. Langage de programmation Java

Java Licence Professionnelle CISII,

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

TP, première séquence d exercices.

Classe Interne, Anonyme & Enumération

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

ACTIVITÉ DE PROGRAMMATION

Programmation en Java IUT GEII (MC-II1) 1

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Threads. Threads. USTL routier 1

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Programmation Orientée Objet application au langage Java Version Novembre 2007

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

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Les chaînes de caractères

Cours d initiation à la programmation en C++ Johann Cuenin

Application web de gestion de comptes en banques

.NET - Classe de Log

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Arbres binaires de recherche

Flux de données Lecture/Ecriture Fichiers

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

4. Groupement d objets

Introduction au langage Java

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Introduction au langage C

Transcription:

Chapitre 10: Les interfaces Comparable et Comparator 1/5 Chapitre 10 Les interfaces Comparable et Comparator 1 1 Ce chapitre a été extrait du document "Objets, Algorithmes, Patterns" de [René Lalement], chapitre «Patterns, Les relation d ordre» http://cermics.enpc.fr/polys/oap/node106.html Il a été complété par des commentaires supplémentaires.

Chapitre 10: Les interfaces Comparable et Comparator 2/5 Les relations d'ordre Plusieurs structures de données (notamment SortedSet et SortedMap) et algorithmes sur celles-ci (tri d'une collection ou d'un tableau, recherche binaire dans un tableau trié) supposent que leurs éléments peuvent être comparés par une relation d'ordre. Java exprime cette hypothèse en demandant que la classe des éléments implémente l'interface Comparable ; c'est le cas d'un certain nombre de classes usuelles, dont les éléments sont comparables par un ordre usuel, par exemple : Byte, Short, Integer, Long, Float, Double, BigInteger et BigDecimal: Ordre numérique signé. Char (caractère): Ordre numérique non signé (donc alphabétique). File: ordre lexicographique sur le chemin d'accès. String: ordre lexicographique. Date: Ordre chronologique. Rappelons que l'interface Comparable déclare une seule méthode interface Comparable { int compareto(object o); Cette méthode retourne un entier <0, nul ou >0 selon que l'objet auquel elle est appliquée précède, est égal ou suit o. Voici un exemple de classe qui implémente cette interface ; le constructeur vérifie que ses deux arguments sont non nuls, et déclenche l'exception NullPointerException si ce n'est pas le cas, afin de garantir que les méthodes qui s'appliqueront aux champs prénom et nom ne déclencheront pas cette exception

Chapitre 10: Les interfaces Comparable et Comparator 3/5 import java.util.*; class Nom implements Comparable { private String prénom, nom; String valnom() {return nom; String valprénom() {return prénom; public Nom(String prénom, String nom) { if (prénom==null nom==null) throw new NullPointerException(); this.prénom = prénom; this.nom = nom; On notera que les méthodes equals() et compareto() se comportent différemment si l'objet n'a pas le type requis, ici Nom : le test o instanceof Nom permet à equals(object) de retourner false, tandis que compareto(object), ne procédant pas à ce test, peut déclencher l'exception ClassCastException due au transtypage (Nom) o. D'autre part, toute classe qui redéfinit equals() doit aussi redéfinir hashcode(). En effet, deux objets égaux par equals() doivent avoir la même valeur de hachage par hashcode(). Ces contraintes (sur equals(), compareto(), hashcode(), etc.) doivent être respectées, afin d'assurer à l'utilisateur que les méthodes qui les utilisent (par exemple, Collections.sort, etc.) font bien ce qu'elles sont sensées faire. public boolean equals(object o) { return o instanceof Nom && ((Nom)o).prénom.equals(prénom) && ((Nom)o).nom.equals(nom); public int hashcode() { return 31*prénom.hashCode() + nom.hashcode(); public int compareto(object o) { Nom n = (Nom)o; int compnom = nom.compareto(n.nom); return compnom!=0? compnom : prénom.compareto(n.prénom); public String tostring() { return prénom + " " + nom;

Chapitre 10: Les interfaces Comparable et Comparator 4/5 Enfin, il arrive que des données doivent être comparées selon plusieurs relations : parfois, selon le nom, parfois selon le prénom, etc. Dans ce cas, associer à la classe un ordre naturel en lui faisant implémenter l'interface Comparable n'est pas suffisant. L'API offre une autre interface, Comparator, à cette fin. Ajouter à cela, si vous avez besoin d'ajouter un autre critère de comparaison sachant que le compareto est déjà utilisé, vous ne pouvez pas donc l'implémenter une deuxième fois. L'interface comparable vient à la rescousse. interface Comparator { public int compare(object o1, Object o2); public boolean equals(object obj); L'exemple qui suit montre un exemple d'implémentation de cette interface. Il n'est pas nécessaire de définir dans cet exemple la méthode equals. En effet nous avons récupéré la méthode equals déjà définie dans la classe Object. Il est utile de définir equals (donc redéfinir la méthode de la classe Object) que si vous jugez que votre méthode (equals) est plus efficace et donc rapide. class PrénomComparator implements Comparator { public int compare(object o1, Object o2) { Nom r1 = (Nom) o1; Nom r2 = (Nom) o2; int prénomcomp = r1.valprénom().compareto(r2.valprénom()); if (prénomcomp!= 0) return prénomcomp; else return r1.valnom().compareto(r2.valnom()); On peut alors créer un objet comparateur, et le passer en argument à certaines méthodes qui l'utilisent, par exemple la fonction de tri Collections.sort() :

Chapitre 10: Les interfaces Comparable et Comparator 5/5 class TestcmpTo{ public static void main(string[] args) { Comparator prénomcomparator = new PrénomComparator(); List l = new ArrayList(); l.add(new Nom("Jacque","Brel")); l.add(new Nom("Jackie","Stewart")); l.add(new Nom("Jackie","Chan")); Prise en compte du compareto uniquement. Nous allons donc considéré le tri suivant l'ordre naturel. En cas d'égalité, nous allons trier en fonction du prénom. Collections.sort(l); System.out.println("Comparable: " + l); Prise en compte du compare uniquement. Nous allons donc considérer le tri suivant d'abord le prénom, puis le nom. Collections.sort(l, prénomcomparator); System.out.println("Comparator: " + l); Affichage en sortie Comparable: [Jacque Brel, Jackie Chan, Jackie Stewart] Comparator: [Jackie Chan, Jackie Stewart, Jacque Brel]