• Aucun résultat trouvé

cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 1

N/A
N/A
Protected

Academic year: 2021

Partager "cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 1"

Copied!
8
0
0

Texte intégral

(1)

cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 1 as

Architecture des Systèmes d’Information

Programmation

- Collections et Types g´ en´ eriques -

Nicolas Malandain

April 5, 2005

quelques exemples sont issus du Tutoriel Java de SUN

Collections et Types g´en´eriques 1 / 30

as

Architecture des Systèmes d’Information

1

Collections Pr´ esentation Exemples

L’it´ eration for/in Probl` eme

2

Types g´ en´ eriques Pr´ esentation Classes

Joker et Restriction M´ ethodes

3

Algo g´ en´ eriques Pr´ esentation Le tri d’objets Exemples

4

Autoboxing Pr´ esentation

Collections et Types g´en´eriques 2 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Les collections

D´ efinition

Elles permettent de g´ erer des groupes d’objets de mˆ eme type, leur nombre n’est pas forc´ ement connu ` a l’avance.

Collection versus tableau Tableaux :

non redimensionnables

l’insertion n´ ecessite un d´ ecalage les indices doivent ˆ etre des entiers l´ egers en m´ emoire et acc` es en O(1) Collections :

choix de l’impl´ ementation (complexit´ e) et de l’interface structures dynamiques

algorithmes communs plus gourmands en m´ emoire

Collections et Types g´en´eriques 3 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Hi´ erarchie des collections

hi´ erarchie des interfaces li´ ees aux collection (package java.util)

Collections et Types g´en´eriques 4 / 30

(2)

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

L’interface Collection

Description de l’interface

public interface Collection<E>extendsIterable<E> { // Operations de base

int size();

boolean isEmpty();

boolean contains(Object element);

boolean add(E element); // Optional = retourne vrai si la collection a chang´e boolean remove(Object element); // Optional

Iterator<E> iterator();

// Operations de masse (bulk operation) boolean containsAll(Collection<?> c);

boolean addAll(Collection<?extends E> c);// Optional boolean removeAll(Collection<?> c); // Optional boolean retainAll(Collection<?> c); // Optional

voidclear(); // Optional

// Op´erations de conversion vers des tableaux Object[] toArray();

<T>T[] toArray(T[] a);

}

issu du “tutoriel Sun”

Cette interface est commune ` a toute collection et permet ainsi une interop´ erabilit´ e totale.

Collections et Types g´en´eriques 5 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

L’interface Set

Description de l’interface

public interface Set<E>extendsCollection<E> { // Operations de base

int size();

boolean isEmpty();

boolean contains(Object element);

boolean add(E element); // Optional boolean remove(Object element);// Optional Iterator<E> iterator();

// Operations de masse (bulk operation) boolean containsAll(Collection<?> c);

boolean addAll(Collection<?extends E> c);// Optional boolean removeAll(Collection<?> c);// Optional boolean retainAll(Collection<?> c);// Optional

void clear(); // Optional

// Op´erations de conversion vers des tableaux Object[] toArray();

<T>T[] toArray(T[] a);

}

issu du “tutoriel Sun”

Cette interface est commune ` a toute collection l’impl´ ementant.

Collections et Types g´en´eriques 6 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

L’interface List

Description de l’interface

public interface List<E>extends Collection<E> { // Op´erations de positionnement

E get(intindex);

E set(intindex, E element); // Optional voidadd(intindex, E element); // Optional

E remove(intindex); // Optional

boolean addAll(intindex, Collection<?extendsE> c);// Optional // Op´erations de recherche

int indexOf(Object o);

int lastIndexOf(Object o);

// It´erateur

ListIterator<E> listIterator();

ListIterator<E> listIterator(intindex);

// Intervalles

List<E> subList(intfrom,intto);

}

issu du “tutoriel Sun”

Cette interface est commune ` a toute collection l’impl´ ementant.

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

L’interface Map

Description de l’interface

public interface Map<K,V> { // Op´erations de base Object put(K key, V value);

Object get(Object key);

Object remove(Object key);

boolean containsKey(Object key);

boolean containsValue(Object value);

int size();

boolean isEmpty();

// Operations de masse (bulk operation) void putAll(Map<?extendsK,?extends V> t);

void clear();

// Collections public Set<K> keySet();

public Collection<V> values();

public Set<Map.Entry<K,V>> entrySet();

// Interface for entrySet elements public static interface Entry<K,V> {

boolean equals(Object o);

int hashCode();

K getKey();

V getValue();

V setValue(V value);

}

(3)

cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 3

for/in

Le pattern It´ erateur : l’interface Iterator

Principe

Le pattern it´ erateur est utilis´ e afin de parcourir une collection quelque soit son impl´ ementation et quelque soient les ´ el´ ements qu’elle contient.

L’interface d’Iterator

public interface Iterator<E> { booleanhasNext();

E next();

voidremove(); // Optional }

L’interface Enumeration

Il est maintenant d´ econseill´ e d’utiliser cette interface pour it´ erer sur des collections. En effet, pendant une it´ eration, l’int´ egrit´ e de la collection n’est pas assur´ ee si il y a retrait d’un ´ el´ ement.

Collections et Types g´en´eriques 9 / 30

for/in

Vue globale : Interface/Impl´ ementation

Impl´ementations

Table de haschage Tableau dynamique Arbre ´equilibr´e Liste chain´ee Interfaces

Set HashSet TreeSet

List ArrayList LinkedList

Map HashMap TreeMap

Quelques informations

Classes de collection Java : <Impl´ ementation><Interface>

Java fournit de base 2 impl´ ementations de chaque interface Les classes AbstractSet, AbstractList, . . . fournissent des squelettes facilitant l’impl´ ementation des collections

Collections et Types g´en´eriques 10 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Utilisation de collections

ExempleCollections.java

packagefr.insarouen.asi.prog.cours5;

importjava.util.*;

public class ExempleCollections { public static voidmain(String[] args) {

ArrayList al=new ArrayList();

al.add(newInteger(101));

al.add(newInteger(504));

al.add(newInteger(121));

al.add(newInteger(101));

System.out.println(al);

// le ListIterator fournit des fcts suppl´ementaires (previous, hasPrevious, ...) for(Object i : al)

System.out.println("-- "+((Integer)i).intValue()/2+" --");

HashSet hs=new HashSet(al);

System.out.println(hs);

for(Iterator i=hs.iterator();i.hasNext();) { String eltCourant=((Integer)i.next()).toString();

if (eltCourant.startsWith("1")) i.remove();

}

System.out.println(hs);

} }

Collections et Types g´en´eriques 11 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Le for/in

Syntaxe

for( declaration : expression) instruction ou bloc d’instructions

Utilisation

Cette nouvelle boucle, permet :

sur des tableaux d’utiliser les types simples et objets sur les collections d’utiliser uniquement les types objets (cf autoboxing)

Reprise des it´ erations pr´ ec´ edentes

for(Object i : al)

System.out.println("-- "+((Integer)i).intValue()/2+" --");

for(Iterator i=hs.iterator();i.hasNext();) { String eltCourant=((Integer)i.next()).toString();

if (eltCourant.startsWith("1"))

i.remove();// impossible avec le for/in }

Collections et Types g´en´eriques 12 / 30

(4)

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Les collections et Object

Inconv´ enient

Les collections ne manipulent que des Object :

les collections peuvent ˆ etre totalement h´ et´ erog` enes, c’est ` a la charge du d´ eveloppeur de v´ erifier ce qu’il manipule

il est syst´ ematiquement n´ ecessaire de transtyper

⇒ warning (depuis Java 5.0)

⇒ les types g´ en´ eriques (depuis Java 5.0)

Collections et Types g´en´eriques 13 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Exemples L’it´erationfor/in Probl`eme

Compilation de ExempleCollections.java

Compilation de base

Compiling 1 source file to /home/nicolas/.../classes

Note: /home/nicolas/.../cours5/ExempleCollections.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

Compilation avec -Xlint:unchecked

Compiling 1 source file to /home/nicolas/.../classes /home/nicolas/.../cours5/ExempleCollections.java:19:

warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList al.add(new Integer(101));

/home/nicolas/.../cours5/ExempleCollections.java:20:

warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList ...

5 warnings

Collections et Types g´en´eriques 14 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Pr´ esentation

Principe du type g´ en´ erique

Un type g´ en´ erique est un type param` etrable par un type.

Dans la grande majorit´ e des cas, il s’agit de param´ etrer des collections par la d´ eclaration du type qu’elles manipuleront.

Syntaxe

Type<parametre1, ..., parametreN> // o` u parametre est un type

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Exemples d’utilisation des types g´ en´ eriques

ExempleCollectionGenerique.java

public static voidmain(String[] args) { List<String> als=newArrayList<String>();

als.add("Porferlavecelle Vladimir");

// als.add(1); // ne compile pas

// als.add(new StringBuilder("Moinlquart El´eonore")); // ne compile pas for(Iterator<String> i=als.iterator();i.hasNext();) {

String s = i.next();

System.out.println("-- "+s+" --");

}

for(String s : als)

System.out.println("-- "+s+" --");

HashMap<Integer,String> hm=new HashMap<Integer,String>();

hm.put(newInteger(120281930),"Menvussa G´erard");

hm.put(newInteger(523519023),"Naimard Jean");

for(Integer entier : hm.keySet()) System.out.print("("+entier+") ");

}

Map<String, List<String>> hml=newHashMap<String, List<String>>();

}

(5)

cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 5 Conversion de types g´ en´ eriques

Attention !!!

La conversion de type ne se fait que sur le type de base et non sur le type param` etre.

Illustration du probl` eme

List<String> lstr = newLinkedList<String>(); //ok List<Object> lobj = lstr; // ne compile pas // sinon on aurait le probl`eme suivant lobj.add(newObject());

String str = lstr.get(0); // assignation d’un Object `a un String

Collections et Types g´en´eriques 17 / 30

Objectif

Cr´ eer ses propres classes g´ en´ eriques, les types des attributs et m´ ethodes

´ etant param´ etrables.

Syntaxe pour classe g´ en´ erique

class LaClasse<T> {

// Utilisation du type T comme un type ‘‘normal’’

// d´eclaration d’attributs et m´ethodes utilisant le type T }

// il est courant que le type param`etre ne soit que d’une lettre

Collections et Types g´en´eriques 18 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Exemple

Paire.java

packagefr.insarouen.asi.prog.cours5;

public class Paire<G,D> { private G valeurGauche;

private D valeurDroite;

public Paire(G valeurGauche, D valeurDroite) { this.valeurGauche=valeurGauche;

this.valeurDroite=valeurDroite;

}

public G getValeurGauche() { returnvaleurGauche;

}

public D getValeurDroite() { returnvaleurDroite;

}

public voidsetValeurGauche(G valeur) { valeurGauche = valeur;

}

public voidsetValeurDroite(D valeur) { valeurDroite = valeur;

}

public String toString() {

return"("+getValeurGauche()+","+getValeurDroite()+")";

} }

Collections et Types g´en´eriques 19 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Le joker : ?

Objectif

Sp´ ecifier que n’importe quel type de param` etre est accept´ e.

Collection<?> est une collection d’inconnus

Exemple

public void afficheCollection(Collection<?> c) { for(Iterator i<?>=c.iterator(); i.hasNext();)

System.out.println(i.next().toString());

// for(Object obj : c) // autre syntaxe // System.out.println(obj);

} }

Remarque

L’utilisation de Collection<Object> est une faute puisque la conversion est sur le type de base et non sur le type param` etre. La classe m` ere de toutes les collections est Collection<?> et non Collection<Object>.

Collections et Types g´en´eriques 20 / 30

(6)

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Manipulation des ?

Le type des objets manipul´ es est inconnu

Collection<?> c = new ArrayList<String>();

c.add(new Object()); // ne compile pas c.add(new String(‘‘tutu’’));// ne compile pas Object obj = c.get(0); // compile

on ne peut donc pas ajouter d’´ el´ ement, puisque le type est inconnu par contre on peut consulter sans probl` eme via Object, puisqu’on est au moins sˆ ur de ce type.

Collections et Types g´en´eriques 21 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Restriction des types param` etres

Syntaxe

<T extends UneClasse>

Signifie que T est de type UneClasse ou est d´ eriv´ e de UneClasse

PaireNumerique.java

public class PaireNumerique<Gextends Number, Dextends Number>extends Paire<G,D> { public PaireNumerique(G nbg, D nbd) {

super(nbg,nbd);

}

public doublesomme(){

returngetValeurGauche().doubleValue()+getValeurDroite().doubleValue();

} }

Collections et Types g´en´eriques 22 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

Joker et restriction

Syntaxe

<? extends UneClasse>

Signifie n’importe quelle classe du type UneClasse

reprise de Figure.java

public abstract class Figure { ...

public abstract voiddessine(ZoneDessin d);

}

ZoneDessin.java

public class ZoneDessin {

// n’autorise que des collections de Figure (pas d’int´er^et) public voiddessineFigures(Collection<Figure> figures) {

for(Figure f : figures) f.dessine(this);

}

public voiddessine(Collection<?extends Figure> figures) { for(Figure f : figures)

f.dessine(this);

}

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Classes Joker et Restriction M´ethodes

TestCollectionFigures.java

public class TestCollectionFigures {

// ne compile pas (on ne sait pas quel type d’objet manipule la liste) // est ce un sous-type, un super type ou un type ‘‘fr`ere’’ de LeRectangle ? // public static void ajouter(Collection<? extends Figure> figures) { // figures.add(new LeRectangle(3,4));

// }

public static voidmain(String[] args) { List<LeCercle> lc =newArrayList<LeCercle>();

lc.add(newLeCercle(4));

ZoneDessin zd =new ZoneDessin();

zd.dessine(lc);

} }

(7)

cm05-collectionettypesgeneriques.pdf — April 5, 2005 — 7 M´ ethode g´ en´ erique

Utilisation & Syntaxe

Les m´ ethodes g´ en´ eriques sont utilis´ ees lorsque des d´ ependances existent entre les types des argumements et/ou le type de retour. Dans le cas contraire (un seul type de param` etre) la simple utilisation du joker suffit.

<T> typeretour methode(param`etres) {

// utilisation du type T comme un type normal // param`etre, variable locale, ...

}

Probl` eme classique (d´ ej` a ´ evoqu´ e pr´ ec´ edemment)

static voidtableauVersCollection(Object[] tab, Collection<?> col) { for(Object o : tab)

c.add(o)// ne compile pas }

static void<T> tableauVersCollection(T[] tab, Collection<T> col) { for(T o : tab)

c.add(o)// compile }

Collections et Types g´en´eriques 25 / 30

La classe Collections

Description Collections

ne contient que des m´ ethodes de classe manipule des Collection

offre des algorithmes g´ en´ eriques (tri, max, min, copie, remplacement, . . . )

Pr´ esentation du tri d’objets comme exemple de ces m´ ethodes g´ en´ eriques

Collections et Types g´en´eriques 26 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Le tri d’objets Exemples

La m´ ethode sort

Deux m´ ethodes de tri dans Collections

public static <T extendsComparable<? super T>> void sort(List<T> list) public static <T> void sort(List<T> list, Comparator<? superT> c)

L’interface Comparable

Utilis´ e par la 1

m´ ethode, les objets ` a comparer doivent l’impl´ ementer

public interface Comparable<T> { public int compareTo(T o);

}

L’interface Comparator

Utilis´ e par la 2

m´ ethode, pour comparer des objets n’impl´ ementant pas Comparable ou pour d´ efinir un autre syst` eme de comparaison.

public interface Comparator<T> { public int compare(T o1, T o2);

public boolean equals(Object o);

}

Collections et Types g´en´eriques 27 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Le tri d’objets Exemples

Exemple avec l’interface Comparable

Reprise de PaireNumerique.java

public class PaireNumerique<G extends Number, D extends Number>

extends Paire<G,D>

implements Comparable<PaireNumerique<?,?>> {

public PaireNumerique(G nbg, D nbd) { super(nbg,nbd);

}

public int compareTo(PaireNumerique<?,?> pn) {

doubleres=getValeurGauche().doubleValue()-pn.getValeurGauche().doubleValue();

if (res < 0) return -1;

if (res > 0) return 1;

return 0;

}

public double somme(){

return getValeurGauche().doubleValue()+getValeurDroite().doubleValue();

} }

Collections et Types g´en´eriques 28 / 30

(8)

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation Le tri d’objets Exemples

Ex´ ecution + exemple avec l’interface Comparator

main

PaireNumerique<Double,Integer> pn1 =newPaireNumerique<Double,Integer>(newDouble(0.10),newInteger(3));

PaireNumerique<Integer,Integer> pn2 =newPaireNumerique<Integer,Integer>(newInteger(4),newInteger(3));

PaireNumerique<Float,Integer> pn3 =newPaireNumerique<Float,Integer>(newFloat(20.10),newInteger(3));

List<PaireNumerique<?,?>> l =newArrayList<PaireNumerique<?,?>>();

l.add(pn3);

l.add(pn2);

l.add(pn1);

Collections.sort(l);

for(PaireNumerique pni : l) System.out.println(pni);

Collections.sort(l,newComparator<PaireNumerique<?,?>>() { public intcompare(PaireNumerique<?,?> o1, PaireNumerique<?,?> o2) {

doubleres=o1.getValeurGauche().doubleValue()-o2.getValeurGauche().doubleValue();

if (res < 0) return1;

if (res > 0) return-1;

return0;

} });

for(PaireNumerique pni : l) System.out.println(pni);

Collections et Types g´en´eriques 29 / 30

Collections Types g´en´eriques Algo g´en´eriques Autoboxing Pr´esentation

Autoboxing / Unboxing

Principe

“convertir” un type simple dans son type classe et r´ eciproquement

AutoBoxing.java

public class AutoBoxing { static voidmethode(Integer i) {

System.out.println("Integer : "+i);

}

static voidmethode(doubled) { System.out.println("double : "+d);

}

public static voidmain(String[] args) { Integer i1=10;

int i2=i1;

// 10 autoboxing/unboxing for(Integer i3=0; i3<10; i3++)

System.out.println(i3);

// pour compatibilit´e avec les JDK pr´ec´edents // => double : 5.0

methode(5);

Integer a256 = 256, b256 = 256;

if (a256 == b256)

System.out.println("Egal");

else

System.out.println("Non egal");

// les Integer de -127 `a 127 sont fig´es // fig´e = immutable

Integer a120 = 120, b120 = 120;

if (a120 == b120)

System.out.println("Egal");

else

System.out.println("Non egal");

} }

Collections et Types g´en´eriques 30 / 30

Références

Documents relatifs

Pour chacun des ensembles suivants, d´ eterminer s’il est major´ e, s’il est minor´ e, s’il a un maximum, s’il a un minimum, et le cas ´ ech´ eant d´ eterminer ses bornes

Illustration par un contre- exemple de la n´ecessit´e de l’hypoth`ese de signe constant sur le terme g´en´eral de l’une des s´eries5. Th` eme de la colle : S´ eries

public Node(IState state, Node parent, String action, int costChemin, int depth) {}. public Node(IState

D´ eterminer pour quelles valeurs de a cette int´ egrale est

L’existence et l’unicit´e des solutions entropiques pour un syst`eme d’EDP non lin´eaire conte- nant des termes g´en´eraux de diffusion anisotropiques et des termes de

Pour int´egrer un document vectoriel dans une page web, pour r´eutiliser le contenu d’un document ou pour int´egrer de la dynamicit´e dans le document, il est

Le but ici est de visiter le plus de villes possibles sachant qu’aucune ville ne peut ˆ etre visit´ ee plus d’une fois, que les bus doivent suivre les arcs et que la premi` ere

La preuve du th´ eor` eme de Birkhoff que nous allons mettre en œuvre, tir´ ee de Struwe [8], est fond´ ee sur l’id´ ee simple suivante : nous allons donc sur l’espace Γ f er