Collections&Generics
-
Upload
hortis -
Category
Technology
-
view
667 -
download
0
description
Transcript of Collections&Generics
2
Iterator<T> hasNext()next()remove()
Collection interface
Collections & Generics Hortis GRC SA - www.hortis.ch
Collection <T>add(T)addAll(Collection<T>)remove(T)removeAll (Collection<T>)retainAll (Collection<T>)clear()contains(T)containsAll(Collection<T>)isEmpty()size()toArray()iterator()
Iterable<T> iterator()
3 Hortis GRC SA - www.hortis.ch
Utilisation d’un Iterable
Seule façon d’accéder au contenu d’une collection quelconque: for( final T item: collection) { ... faire quelque chose... }
Collections & Generics
4
Utilisation d’un Iterator
Seule façon d’accéder et de modifier le contenu d’une collection quelconque:final Iterator<T> iter =
collection.iterator();
while(iter.hasNext()) {
final T item = iter.next();
... faire quelque chose...
if (... condition...) {
iter.remove();
}
}Collections & Generics Hortis GRC SA - www.hortis.ch
5
Utilisation d’un Iterator dans un “for”
Le contenu reste identique:for(final Iterator<T> iter =
collection.iterator();iter.hasNext();) {
final T item = iter.next();
... faire quelque chose...
if (... condition...) {
iter.remove();
}
}
Collections & Generics Hortis GRC SA - www.hortis.ch
6
Comparable
Donne un ordre “naturel”:Interface Comparable<T> {
int compareTo(T o);
}
Exemple pour une liste:final List<T extends Comparable<T>>
myList = ...
Collections.sort(myList);
Collections & Generics Hortis GRC SA - www.hortis.ch
7
Comparator
Pour mettre de l’ordre dans les collections:Interface Comparator<T> {
int compare(T o1, To2);
}
Exemple pour une liste:final List<T> myList = ...
final Comparator<T> myComparator = ...
Collections.sort(myList, myComparator);
Collections & Generics Hortis GRC SA - www.hortis.ch
8
Lists and Sets
Une liste possède un ordre, Un Set ne contient aucun doublon.
Collections & Generics Hortis GRC SA - www.hortis.ch
9
Lists and Sets
Collections & Generics Hortis GRC SA - www.hortis.ch
Collection<T>
List<T>get(int)remove(int)add(int,T)set(int,T)indexOf(T)lastIndexOf(T)subList(int,int)
Set<T>
SortedSet<T> comparator()first()last()subSet(T,T)headSet(T)tailSet(T)
10
Maps
Permet un accès indexé par n’importe quel object: “buckets” adressés par le hashCode, Séparation à l’intérieur d’un “bucket” à l’aide de la
méthode equals .
Collections & Generics Hortis GRC SA - www.hortis.ch
11
Maps
Collections & Generics Hortis GRC SA - www.hortis.ch
Collection<T>
Map<K,T>put(K,T)putAll(Map<K,T>)remove(K)get(K)clear()size()containsKey(K)containsValue(T)keySet()values()
Set<K>
SortedMap<K,T> comparator()firstKey()lastKey()subMap(K,K)headMap(K)tailMap(K)
12
Synchronization
Collections & Generics Hortis GRC SA - www.hortis.ch
Collection type
Synchronized object factory
Collection synchronizedCollection()
List synchronizedList()
Set synchronizedSet()
SortedSet synchronizedSortedSet()
Map synchronizedMap()
SortedMap synchronizedSortedMap()
13
Full collection hierachy
Collections & Generics Hortis GRC SA - www.hortis.ch
AbstractCollection
AbstractList AbstractSet
ArrayList Vector HashSet TreeSet
Collection
Set
SortedSet
List
AbstractSequentialList
LinkedListStack
AbstractQueue
14
Full Map hierachy
Collections & Generics Hortis GRC SA - www.hortis.ch
AbstractMap
HashMap TreeMap
SortedMap
Map
WeakHashMap
Hashtable
Dictionary
15
Boxing and auto-boxing
Une Collection ou une Map contient des objects, pas des primitives,
Usage correct (boxing explicite) :Collection<Integer> measures = ...;
measures.add(new Integer(4));
Usage permis (boxing implicite) :measures.add(4);
Collections & Generics Hortis GRC SA - www.hortis.ch
16
Convertions
Arrays → Listes :MyClass[] myArray = ...;
Collection<MyClass> measures = Arrays.asList(myArray);
Listes → Arrays :
Collection<MyClass> measures = ...;
MyClass[] myArray = measures.toArray(
new MyClass[measures.size()]);
Collections & Generics Hortis GRC SA - www.hortis.ch
17
“Backed” collections
Une “feature” dangereuse des collections construites sur des Map:
Collections & Generics Hortis GRC SA - www.hortis.ch
keySet() tailset()
values() tailmap()
headset() subSet()
headmap() subMap()
18
keySet() tailset()
values() tailmap()
headset() subSet()
headmap() subMap()
Collections & Generics Hortis GRC SA - www.hortis.ch
19
Déclarations générique
Déclaration pour le compilateur seulement, Le type “générique” n’a pas d’existence dans
la machine virtuelle, Un type se déclare au niveau:
de la classe, d’une méthode (non-static ou static);
Il s’agit donc d’un simple “pattern-matching”
Collections & Generics Hortis GRC SA - www.hortis.ch
20
Différences fondamentale
Les arrays ont accès à l’héritage:Number[] measures = new Integer[4];
Les collections pas!List<Number> measures =
new ArrayList<Integer>();
... parce que le type de la déclaration de la collection n’existe pas en dehors du compilateur.
Collections & Generics Hortis GRC SA - www.hortis.ch
Faux!!
21
Comment faire?
On utilise la notation <? extends xxx>, Par exemple :
List<? extends Number> measures =new ArrayList<Integer>();
Par contre :Number meter = measures.get(0);
Integer mm = measures.get(1);
Collections & Generics Hortis GRC SA - www.hortis.ch
(Integer)
22
Exemple: filtre générique
Collections & Generics Hortis GRC SA - www.hortis.ch
public abstract class AbstractObjectFilter<T> {
private final EventListenerList listenerList = new EventListenerList();
public void addChangeListener(ChangeListener listener) {listenerList.add(ChangeListener.class, listener);
}
public void removeChangeListener(ChangeListener listener) {listenerList.remove(ChangeListener.class, listener);
}
protected void fireChanged() {final ChangeEvent event = new ChangeEvent(this);final Object[] listeners = listenerList.getListenerList();for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) { ((ChangeListener) listeners[i + 1]).stateChanged(event);}
}}
public abstract boolean accept(T object);}
23
Exemple: utilisation filtre
Collections & Generics Hortis GRC SA - www.hortis.ch
public boolean collect(List<D> adaptedObjects, IObjectListModel<? extends D> model) {
final boolean added = false;for (final D object : model) {
if (filter.accept(object)) {adaptedObjects.add(object);
}}return added;
}
24
Exemple: binding sur une sous-classe
Collections & Generics Hortis GRC SA - www.hortis.ch
public class WayPointDifferentiator extends AbstractNamedAdaptationDataDifferentiator<WayPoint> {
public final static WayPointDifferentiatorinstance = new WayPointDifferentiator();
private WayPointDifferentiator() {super();
}
@Overridepublic boolean equals(final WayPoint o1, final WayPoint o2) {
return super.equals(o1, o2) && (o1 == null || valueEquals(o1.getArea(), o2.getArea()));
}
@Overridepublic Class<WayPoint> getObjectClass() {
return WayPoint.class;}
@Overrideprotected void collectAccessors(ArrayList<String> accessorList) {
super.collectAccessors(accessorList);accessorList.add("ShortName");accessorList.add("Wgs84Latitude");accessorList.add("Wgs84Longitude");
}}
25
Exemple: binding sur une méthode
Collections & Generics Hortis GRC SA - www.hortis.ch
public abstract class AbstractAdaptationData<T>implements Serializable, IVersionable<T>, Comparable<T> {
public static <D extends Comparable<D>> int compare(final D v1, final D v2) {if (v2 == null) {
return v1 == null ? 0 : 1;} else if (v1 == null) {
return -1;}return v1.compareTo(v2);
}
26
Exemple: binding sur une méthode
Collections & Generics Hortis GRC SA - www.hortis.ch
public <T extends AbstractAdaptationData<T>> void loadDescriptorData(final AdaptationDataManager manager,final AdaptationDataRepository dataRepository, final AbstractAdaptationDataDescriptor<T> _descriptor,final SubtableController _subtableController, final T selectedObject, final boolean activateSearchField) {
setName(_descriptor.getName());final ObjectTableModel<T> tableModel =
_descriptor.getTableModel(manager, selectedObject);tableModel.setResourceBundle(manager.getResourceBundle());table = new JTableWithToolTips(tableModel);table.setName(_descriptor.getName());final String searchColumn = _descriptor.getSearchColumn();MutableDynamicTableFilter<T> dynamicTableFilter = null;MutableDynamicTableSorter<T> dynamicTableSorter = null;final DefaultColumnFilterFactory<T> filterFactory =
_descriptor.getFilterFactory(manager);
27
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
28
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
29
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
ClassCastException
30
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
31
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
32
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
33
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
34
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
35
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
36
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
37
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
38
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
39
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
40
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
41
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch
42
Questionaire
Collections & Generics Hortis GRC SA - www.hortis.ch