Vous êtes sur la page 1sur 22

Les collections

Page 1
Les collections Java

n Une collection (parfois appelée conteneur) est un objet qui regroupe de


multiples éléments.

n Un framework de collections est une architecture unifiée de représentation et de


manipulation de collections.

n Le framework de collections java consiste en :

u Des interfaces

u Des collections concrètes (Structures de données réutilisables).

u Des algorithmes (Fonctionnalités réutilisables)

copyright ©Thierry Douchet


2
Janvier 2006
Présentation du framework

«interface»
«interface» «interface»
Collection
Iterator utilise Map
utilise

«interface» «interface» «interface»


«interface»
List Set SortedMap
ListIterator utilise
HashMap

LinkedList
«interface»
Vector
SortedSet TreeMap

ArrayList
HashSet

Stack

TreeSet

copyright ©Thierry Douchet


3
Janvier 2006
L’interface Collection

n Une collection est utilisée pour manipuler n’importe quelle collection réelle à
partir d’une interface de services générale :

public interface Collection


{
boolean add(Object o);
boolean addAll(Collection c);
void clear();
boolean contains(Object o);
boolean containsAll(Collection c);
boolean equals(Object o);
int hashCode();
boolean isEmpty();
Iterator iterator();
boolean remove(Object o);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
int size();
Object[ ] toArray();
Object[ ] toArray(Object a[ ]);
copyright ©Thierry Douchet
} 4
Janvier 2006
L’interface List

n C’est une collection ordonnée (parfois appelée Séquence) qui peut contenir des
éléments dupliqués (redondance).

n Elle vient compléter l’interface collection en ajoutant des méthodes spécifiques


pour les listes.

public interface List extends Collection


{
boolean add ( int index , Object o ) ;
Object remove ( int index ) ;
Object get ( int index ) ;
Object set ( int index , Object o ) ;
public int indexOf ( Object o )
public int lastIndexOf ( Object o )
ListIterator listIterator() ;
List SubList ( int fromIndex , int toIndex ) ;
}

copyright ©Thierry Douchet


5
Janvier 2006
Implémentation de List

n Java ne propose pas d’implémentation directe des interfaces. Ces


implémentations se situent dans une hiérarchie de classes abstraites.

«interface» «interface»
AbstractCollection
Iterator Collection
utilise

«interface» «interface» AbstractList


ListIterator List
utilise

ArrayList

copyright ©Thierry Douchet


6
Janvier 2006
La classe AbstractCollection

public abstract class AbstractCollection implements Collection


{
protected AbstractCollection() { }
public abstract int size();
public abstract Iterator iterator();

public boolean isEmpty()


{ return size() == 0; }

public boolean contains(Object o)


{ Iterator e = iterator();
if (o==null)
{ while (e.hasNext())
if (e.next()==null) return true;
}
else
{ while (e.hasNext())
if (o.equals(e.next())) return true;
}
return false;
}
} copyright ©Thierry Douchet
7
Janvier 2006
La classe AbstractList

n La classe AbstractList redéfinit les méthodes de la classe List ou requalifie


d’abstract celles qu’elle n’est pas capable de définir.

public abstract class AbstractList extends AbstractCollection implements List


{
abstract public Object get(int index);
public int indexOf ( Object o )
{ ListIterator e = listIterator();
if (o==null)
{ while (e.hasNext())
if (e.next()==null) return e.previousIndex();
} else
{
while (e.hasNext())
if (o.equals(e.next())) return e.previousIndex();
}
return -1;
}
}

copyright ©Thierry Douchet


8
Janvier 2006
La classe ArrayList

n La classe ArrayList vient compléter la hiérarchie en donnant un sens à


l’ensemble des méthodes restantes :

public class ArrayList extends AbstractList


implements List, RandomAccess, Cloneable, java.io.Serializable
{
private transient Object elementData[] ;
private int size ;
public ArrayList ( int initialCapacity )
{ super();
if (initialCapacity < 0)
throw new IllegalArgumentException ( "Illegal Capacity: "+ initialCapacity );
this.elementData = new Object[initialCapacity];
}
public ArrayList() { this ( 10 ) ; }
public boolean add(Object o)
{
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}
}
copyright ©Thierry Douchet
9
Janvier 2006
Exemple

import java.util.* ;

class Demo
{
public static void main (String args [ ])
{
ArrayList list ;
list = new ArrayList () ;
list.add ( new Point ( 10 , 20 ) ) ;
list.add ( new Point ( 20 , 40 ) ) ;
list.add ( new Point ( 30 , 50 ) ) ;
for ( int i = 0 ; i < list.size () ; i++ )
( ( Point ) list.get ( i ) ).print () ;
}
}

copyright ©Thierry Douchet


10
Janvier 2006
Recherche d’un élément

n La méthode contains () permet de rechercher si un élément est présent dans le


tableau :

import java.util.* ;
class Demo
{ public static void main (String args [ ])
{ ArrayList list = new ArrayList () ; ;
Point p1 = new Point ( 10 , 20 ) ;
list.add ( p1 ) ;
list.add ( new Point ( 20 , 40 ) ) ;
list.add ( new Point ( 30 , 50 ) ) ;
if ( list.contains ( p1 ) )
System.out.println ( "ok" ) ;
else
System.out.println ( "non ok " ) ;
if ( list.contains ( new Point ( 20 , 40 ) ) ) System.out.println ( "ok" ) ;
else System.out.println ( "non ok " ) ;
}
}

copyright ©Thierry Douchet


11
Janvier 2006
Redéfinition de la méthode equals

n La classe Point doit redéfinir la méthode equals :

class Point
{
…..
public boolean equals ( Object obj )
{
if ( ! ( obj instanceof Point ) )
return false ;
return ( ( x == ( ( Point ) obj ).x ) && ( y == ( ( Point ) obj ).y ) ) ;
}
}

copyright ©Thierry Douchet


12
Janvier 2006
Les itérateurs

n Un itérateur permet de parcourir une collection sans se soucier de la nature des


objets.

n Le parcours d’une collection s’effectue de la manière suivante :

u appel de la méthode iterator() sur le conteneur pour renvoyer un iterator.

u récupérer l'objet suivant dans la séquence grâce à sa méthode next().

u vérifier s'il reste encore d'autres objets dans la séquence via la méthode hasNext().

n On a également la possibilité d’enlever le dernier élément renvoyé par l'itérateur


avec la méthode remove().

copyright ©Thierry Douchet


13
Janvier 2006
Exemple

import java.util.* ;

class Demo
{
public static void main ( String args [ ] )
{
ArrayList list ;
list = new ArrayList () ;
list.add ( "chaine1" ) ;
list.add ( "chaine2" ) ;
list.add ( "chaine3" ) ;
for ( Iterator i = list.iterator () ; i.hasNext ( ) ; )
System.out.println ( i.next() ) ;
}
}

copyright ©Thierry Douchet


14
Janvier 2006
L’interface Set

n Elle correspond à un groupe d’objets qui n’accepte pas 2 objets égaux au sens de equals
(comme les ensembles des mathématiques).

n L’interface Set n’ajoute aucune méthode à l’interface Collection. Elle ne spécifie que les
restrictions attendues sur les méthodes de base (unicité des objets).

n La méthode add n’ajoute pas un élément si un élément égal est déjà dans l’ensemble (la
méthode renvoie alors false)

import java.util.* ;
public class Demo
{
public static void main ( String args[] )
{
Set s = new HashSet ( );
String tab[] = { "a" , "b" , "c" , "b" } ;
for ( int i = 0 ; i < tab.length ; i++ )
if ( ! s.add ( tab[i] ) )
System.out.println ("duplication detectee : " + tab[i] );
System.out.println ( s.size() + " mots dans le set " + s );
}
} copyright ©Thierry Douchet
15
Janvier 2006
La classe TreeSet

n C’est un ensemble trié. Il garantit que les éléments sont rangés dans leur ordre
naturel.

n Pour effectuer le tri, le TreeSet a besoin d’utiliser une méthode de comparaison.

n Une relation d’ordre sur des objets peut être définie en implémentant l’interface
Comparable

n L’interface Comparable consiste en une seule opération :

public interface Comparable


{
public int compareTo ( Object o ) ;
}

n Les classes implémentant cette interface peuvent être triées automatiquement.

copyright ©Thierry Douchet


16
Janvier 2006
L’interface Comparable

n Une relation d’ordre naturelle n’est pas toujours suffisante :

u Ordonner des objets à travers une autre relation d’ordre

u Ordonner des objets qui n’implémentent pas l’interface Comparable

n Un comparateur (interface Comparator) peut être utilisé dans le cas où la


relation d’ordre naturelle ne suffit pas :

public interface Comparator


{
public int compare ( Object o1 , Object o 2 ) ;
}

copyright ©Thierry Douchet


17
Janvier 2006
Exemple

class Revue implements Comparable


{
private String titre ;
private int numero ;

public Revue ( int _numero , String _titre )


{ titre = _titre ; numero = _numero ; }
public int getNumero () {return numero ; }
public String getTitre () {return titre ; }

public String toString ()


{ return titre + " " + numero ; }

public int compareTo ( Object obj )


{ return titre.compareTo ( ((Revue ) obj ).titre) ; }
}

copyright ©Thierry Douchet


18
Janvier 2006
Exemple

import java.util.* ;

public class Demo


{
public static void main ( String args[] )
{
TreeSet listeRevues = new TreeSet () ;
listeRevues.add ( new Revue ( 1 , "Geo") ) ;
listeRevues.add( new Revue ( 2 , "Paris Match" ) ) ;
listeRevues.add( new Revue ( 3 ,"France Football") ) ;
listeRevues.add( new Revue ( 4 , "Paris Match" ) );
for ( Iterator i = listeRevues.iterator () ; i.hasNext () ; )
System.out.println ( i.next () ) ;
}
}

copyright ©Thierry Douchet


19
Janvier 2006
L’interface Map

n L’interface Map correspond à un groupe de couples objets-clés.

public interface Map


{
void clear()
retourne null si la clé
boolean containsKey(Object clé)
boolean containsValue(Object valeur) n’existe pas
Set entrySet()
Object get(Object clé)
boolean isEmpty()
Set keySet()
Object put(Object clé, Object valeur)
void putAll(Map map)
void remove(Object key)
int size()
Collection values()
};

n Une clé repère un et un seul objet.

n Deux clés ne peuvent être égales au sens de equals.


copyright ©Thierry Douchet
20
Janvier 2006
Les HashMap

n Les Classes qui implémentent l’interface Map sont :

u HashMap, table de hachage ; garantit un accès en temps constant

u TreeMap, arbre ordonné suivant les valeurs des clés

n Exemple

import java.util.* ;
public class Demo
{
public static void main ( String args[] )
{
HashMap listePersonne = new HashMap () ;
listePersonne.put( "Bond" , new Personne ( "Bond" , "James" , 45) ) ;
listePersonne.put( "Jones" , new Personne ( "Jones" , "Indiana" , 40 )) ;
(( Personne )listePersonne.get ( "Bond" )).afficher() ;
}
}

copyright ©Thierry Douchet


21
Janvier 2006
Les utilitaires

n La classe Collections fournit un ensemble d’algorithme pour travailler sur les


collections (tri, recherche, copie…) :

public class Demo


{
public static void main ( String args[] )
{
String tabChaine [] = { "chaine3" , "chaine1" , "chaine2" } ;
List listeChaine ;
listeChaine = Arrays.asList ( tabChaine ) ;
Collections.sort ( listeChaine ) ;
for ( Iterator i = listeChaine.iterator () ; i.hasNext () ; )
System.out.println (i.next());
}
}

copyright ©Thierry Douchet


22
Janvier 2006

Vous aimerez peut-être aussi