Voyons `a pr´esent pourquoi l’utilisation de Collections.sort est inefficace.
Pour cela, observons le code-source du projet GNU Classpath 0.95 1.
Dans java.util.Collections :
2107: public static <T> void sort(List<T> l, Comparator<? super T> c)
2108: {
2109: T[] a = (T[]) l.toArray();
2110: Arrays.sort(a, c);
2111: ListIterator<T> i = l.listIterator();
2112: for (int pos = 0, alen = a.length; pos < alen; pos++)
2113: {
2114: i.next();
2115: i.set(a[pos]);
2116: }
2117: }
Dans java.util.Vector :
179: public synchronized void copyInto(Object[] a)
180: {
181: System.arraycopy(elementData, 0, a, 0, elementCount);
182: }
550: public synchronized Object[] toArray()
551: {
552: Object[] newArray = new Object[elementCount];
553: copyInto(newArray);
554: return newArray;
555: }
Autrement dit, la m´ethode na¨ıve a deux sources d’inefficacit´e. Premi`ere-
ment, elle n´ecessite de recopier le tableau interne du vecteur. Cela est n´eces-
saire car la m´ethode propos´ee pour trier est g´en´erale, et ne peut donc pas
tirer parti du fait qu’un vecteur utilise un tableau en interne. Deuxi`emement,
le parcours de la structure pour y replacer les ´el´ements tri´es est lourde de
par les nombreux appels de fonctions n´ecessaires.
La m´ethode de tri mise au point tire parti du fait que la classe Vector
n’est pas d´eclar´ee finale, et que le tableau interne est seulement protected.
Nous cr´eons donc une nouvelle classe, SortableVector, qui h´erite de Vector
et y ajoute les fonctions de tri. Nous pouvons ainsi passer le tableau interne
directement `a Arrays.sort. De plus, cette fa¸con de proc´eder permet d’ajouter
des fonctions permettant de trier une partie du contenu du vecteur, ce qui
n’est pas possible via la classe Collections. Voici la solution propos´ee :
1http ://developer.classpath.org/doc/
2