1.09k likes | 1.32k Views
COURS DE PROGRAMMATION ORIENTEE OBJET :. Les collections en Java. Plan. Les interfaces List Set Queue Deque Map Iterator Les classes abstraites et concrètes. Bibliothèque de Collections JAVA.
E N D
COURS DE PROGRAMMATION ORIENTEE OBJET : Les collections en Java
Plan • Les interfaces • List • Set • Queue • Deque • Map • Iterator • Les classes abstraites et concrètes
Bibliothèque de Collections JAVA La bibliothèque standard de Java fournit des implantations de TAD classiques qu’il suffit ensuite de savoir utiliser de manière adaptée en fonction du problème.
Bibliothèque de Collections JAVA Définitions Une collection est un conteneur d’objets Un cadre (framework) définit un certain nombre d’interfaces de classes abstraites de mécanismes.
Bibliothèque de Collections JAVA Définitions La bibliothèque de collections Java constitue un cadre pour des classes de collections. Ce cadre définit des interfaces des classes abstraites pour implanter les collections un protocole d’itération.
Bibliothèque de Collections JAVA Avec le JDK 5.0, les classes et les interfaces sont devenues génériques avec paramètre de type: List<Employe> Avantages : permet d’écrire un code plus sûr (plus de risques de collections hétérogènes) plus facile à lire car plus de transtypage Si on utilise une version antérieure de Java, il faut ignorer les paramètres de type et remplacer les types génériques par le type Object.
Les vieux : Collections du JDK 1.1 Les classes et interfaces suivantes, fournies par le JDK 1.1, Vector HashTable Enumeration existent encore mais il vaut mieux utiliser les nouvelles classes du JDK 1.2 Il est cependant utile de les connaître car elles sont utilisées dans d’autres API du JDK Elles ne seront pas étudiées ici en détails
Petit exemple List<String> l = new ArrayList<String>(); l.add("Pierre Jacques"); l.add("Pierre Paul"); l.add("Jacques Pierre"); l.add("Paul Jacques"); Collections.sort(l); System.out.println(l);
Petit exemple Map<String, Integer> frequences = new HashMap<String, Integer>(); for (String mot : args) { Integerfreq = frequences.get(mot); if (freq == null) { freq = 1; } else { freq = freq + 1; } frequences.put(mot, freq); } System.out.println(frequences);
COLLECTIONS JAVA Les interfaces Le cadre est composé de 10 interfaces définies dans le paquetage java.util. Il existe deux interfaces fondamentales pour les conteneurs: Collection Map
COLLECTIONS JAVA Les interfaces Collection Queue List Set Deque SortedSet
COLLECTIONS JAVA Les interfaces Map Iterator ListIterator SortedMap
COLLECTIONS JAVA Les interfaces : Collection public interface Collection<E>{ booleanadd (E o); booleanaddAll(Collection<? extends E> c); voidclear (); booleancontains (Object o); booleancontainsAll (Collection<?> c); booleanequals (Object o); inthashCode (); ...
COLLECTIONS JAVA booleanisEmpty(); Iterator<E> iterator(); booleanremove(Object object); booleanremoveAll(Collection<?> c); intsize(); Object[] toArray (); }
COLLECTIONS JAVA Les interfaces : Types Joker Collection<? extends E> remplace toute collection générique dont le type est un sous-type de E. Exemple :Collection<? extendsCompteBancaire> remplace Collection<CompteCourant> ou Collection<CompteEpargne>. Utilité : On veut pouvoir ajouter une collection d’objets de types CompteCourant à une collection d’objets de type CompteBancaire. Mais Collection <CompteCourant> n’étend pas Collection <CompteBancaire>.
COLLECTIONS JAVA Les interfaces Interface List Permet de manipuler des collections triées. Les éléments sont ajoutés à une position particulière dans le conteneur. Un objet pourra être inséré à une position adéquate indiquée soit par un indice entier par un itérateur de liste
COLLECTIONS JAVA Les interfaces :List interface List<E> extends Collection<E> Les méthodes supplémentaires voidadd (int index, Eelement); Eget (int index); intindexOf (Object object); ListIterator<E> listIterator (); Eremove (int index); E set (int index, Eelement); List<E> subList (intstart, int stop);
COLLECTIONS JAVA Les interfaces Interface Set public interface Set<E> extends Collection<E> Aucune méthode n’est ajoutée en plus. Le comportement des méthodes y est défini de manière plus précise: La méthode addrejette les valeurs doubles. La méthodeequalsteste si deux ensembles ont les mêmes éléments mais pas nécessairement dans le même ordre.
COLLECTIONS JAVA Les interfaces : Queue public interface Queue<E> extends Collection<E> Collections permettant la gestion des files de type FIFO ou LIFO (piles) et des files de priorités. L’insertion respecte un certain ordre suivant le type de file. Toutes les files définissent l’extraction et la consultation en tête de la file. Supporte les files de capacité restreinte comme les files de capacité illimitée.
COLLECTIONS JAVA Les interfaces Interface Queue Les opérations d’insertion, d’extraction et de consultation sont de deux formes: Elles lèvent des exceptions si l’opération échoue. Elles retourne une valeur spéciale (null ou false) si l’opération échoue.
COLLECTIONS JAVA Les interfaces : Interface Deque (double ended queue) public interface Deque<E> extends Queue<E> Collections linéaires qui supportent les insertions et les extractions aux deux extrémités. L’insertion respecte un certain ordre suivant le type de file. Toutes les files définissent l’extraction et la consultation en tête de la file. Supporte les « deques » de capacité restreinte comme les « deques » de capacité illimitée.
COLLECTIONS JAVA Les interfaces : Deque
COLLECTIONS JAVA Les interfaces : Deque Quand une « deque » est utilisée comme une file, c’est une file de type FIFO qui est gérée: add(e) appelle addLast(e) offer(e) appelle offerLast(e) remove() appelle removeFirst() poll() appelle pollFirst() element() appelle getFirst() peek() appelle peekFirst()
COLLECTIONS JAVA Les interfaces : Deque Une « deque » peut être utilisée comme une Pile en utilisant les méthodes : addFirst(e) removeFirst() getFirst()
COLLECTIONS JAVA Les interfaces : Map public interface Map<K,V>{ intsize(); booleanisEmpty(); booleancontainsKey(Object key); booleancontainsValue(Object value); Vget(Object key); Vput(Kkey, V value); booleanequals (Object object); inthashCode(); ...
COLLECTIONS JAVA Les interfaces : Map voidclear(); Vremove(Object key); voidputAll(Map<? extends K,? Extends V> m); Set<K> keySet(); Collection<V> values();
COLLECTIONS JAVA Les interfaces : Map public Set<Map.Entry<K,V>> entrySet(); //retourne un ensemble composé des éléments de la table //Chaque élément retourné est un Map.Entry<K,V> public interface Entry <K,V>{ KgetKey(); VgetValue(); VsetValue(V value); booleanequals(Object o); inthashCode(); }}
COLLECTIONS JAVA Les interfaces Interface Map – Les vues d’une table Une table n’est pas réellement une collection, c’est une collection de paires. Possibilité d’obtenir une vue d’une table, i.e. un objet qui implémente l’interface Collection ou une de ses sous-interface.
COLLECTIONS JAVA Les interfaces : Map – Les vues d’une table Il existe 3 vues différentes : L’ensemble des clés fournie par la méthode public Set<K> keySet(); L’ensemble des valeurs fournie par la méthode public Collection<V> values(); L’ensemble des paires clé/valeur fournie par la méthode public Set<Map.Entry<K,V>> entrySet();
COLLECTIONS JAVA Les interfaces Interfaces SortedSet, SortedMap Mettent en évidence l’objet de comparaison utilisé pour trier les éléments.
Interfaces Les interfaces : Iterator– Protocole d’itération Un itérateur est un objet qui parcours une structure de données et passe par chaque élément une seule fois. Plusieurs itérateurs peuvent parcourir la structure simultanément. L’interface Collection<E> possède une méthode public Iterator<E> iterator()qui associe un itérateur à une collection ce qui permet de parcourir la collection.
Les interfaces : Iterator public interface Iterator<E>{ //renvoie true si l’objet de l’itération possède encore au moins un élément public booleanhasNext(); public Enext(); public voidremove(); }
Les interfaces : Iterator La méthodenext : public Enext() throwsNoSuchElementException En appelant plusieurs fois la méthode next, on peut parcourir tous les éléments de la collection Lorsque la fin de la collection est atteinte, une exception est levée : NoSuchElementExceptionqui dérive de RuntimeException. Il faut donc appeler la méthode hasNext avant la méthode next.
Les interfaces : Iterator La méthodenext : Progression d’un itérateur itérateur Élément renvoyé
Les interfaces : Iterator La méthodenext : parcours de tous les éléments de type E d’un objet conteneur //création d’un itérateur sur le conteneur Iterator<E> it = conteneur.iterator(); while(it.hasNext()){ E element = it.next(); //utilisation de l’objectelement }
Les interfaces : Iterator La méthodenext : Application : énumération des paires clé/valeur d’un objet tablede typeMap<K,V> : Set<Map.Entry<K,V>> lesEntrées= table.entrySet(); Iterator<Map.Entry<K,V>> it=lesEntrées.iterator(); while(it.hasNext()){ Map.Entry<K,V> uneEntrée = it.next(); K key = uneEntrée.getKey(); V value = uneEntrée.getValue(); …}
Les interfaces : Iterator La méthoderemovethrowsIllegalStateException Supprime l’élément renvoyé par le dernier appel à next. Obligation d’appelernext avant remove, si on souhaite effacer un élément en fonction de sa position. Iterator<E> it = conteneur.iterator(); it.next(); //passer l’élément it.remove(); //supprimer l’élement
Les interfaces : Iterator Implantation de l’interface Iterator<E>Les itérateurs sont généralement implantés comme des classes internes anonymes définies dans la méthode iterator de la classe de collection associée.
Les interfaces : Iterator Les interfaces : ListIterator<E> La méthode add permet uniquement d’ajouter un object à la fin d’une liste. ListIterator fournit une méthode public voidadd (E e) qui dépend de la position d’un itérateuret qui permet d’ajouter un objet à un endroit donné dans la liste. Les éléments sont ajoutés avant la position courante de l’itérateur
Les interfaces : Iterator Les interfaces : ListIterator<E> Fournit également deux méthodes permettant de parcourir la liste à l’envers : public booleanhasPrevious() public Eprevious() et une méthode public void set (E e) permettant de remplacer le dernier élément renvoyé par next ou previous par un nouvel élément.
Les interfaces : Iterator Interface Iterable<T> Nouvelle interface (depuis JDK 5.0) du paquetage java.langqui indique qu’un objet peut être parcouru par un itérateur Toute classe qui implémente Iterablepeut être parcourue par une boucle « for each » L’interface Collection en hérite
Les interfaces : Iterator Boucle « for each » Boucle « normale » : for(Iterator<Employe> it = coll.iterator(); it.hasNext(); ) { Employee = it.next(); String nom = e.getNom(); } Avec une boucle « for each » : for (Employe e : coll) { String nom = e.getNom(); }
COLLECTIONS JAVA Les classes abstraites AbstractCollection<E> qui implémente Collection<E>, AbstractList<E> qui implémente List<E>, AbstractSequentialList<E> qui implémente List<E>, AbstractSet<E> qui implémente Set<E>, AbstractQueue<E> qui implémente Queue<E>, AbstractMap<E> qui implémente Map<E>.
COLLECTIONS JAVA Les classes abstraites Ces classes sont abstraites car elles n’implémentent pas le corps de toutes les méthodes de l’interface. Les méthodes iterator, size sont des méthodes abstraites qui seront définies dans les classes concrètes car elle dépendent de la structure de données choisie pour implanter le conteneur.
COLLECTIONS JAVA Les classes abstraites Lesclasses abstraites définissent le corps des autres méthodes en faisant appel aux méthodes abstraites , en particulier à la méthode iterator.
COLLECTIONS JAVA Les classes abstraites Exemple : Implémentation de la méthode toStringdans la classe AbstractCollection public String toString(){ if (isEmpty()) return " [ ] "; Iteraror<E> it = iterator(); String str = " [ " + it.next(); while (it.hasNext())str = str + " , "+it.next(); return str + " ] " ;
COLLECTIONS JAVA Les classes concrètes Une classe concrète étend une classe abstraite et fournit les implémentations des méthodes abstraites commeiterator et size. Elle peut aussi redéfinir les autres méthodes si nécessaire.
Méthode Optionnelle Il existe de nombreux cas particuliers de collections ; par exemple collections de taille fixe, collections dont on ne peut enlever des objets Plutôt que de fournir une interface pour chaque cas particulier, l’API sur les collections comporte la notion de méthode optionnelle.
Méthode Optionnelle Méthode qui peut renvoyer une java.lang.UnsupportedOperationException (sous-classe de RuntimeException) dans une classe d'implantation qui ne la supporte pas Les méthodes optionnelles renvoient cette exception dans les classes abstraites du paquetage Exemple d’utilisation : si on veut écrire une classe pour des listes non modifiables, on ne redéfinit pas les méthodes set, add et remove de la classe abstraite AbstractList