SortedSet
est une extension de l'interface
Set
. Cette interface impose de plus que tous les objets enregistrés dans cet ensemble sont automatiquement triés dans un ordre que nous allons préciser. L'itération sur les éléments d'un
SortedSet
se fait dans l'ordre croissant associés aux objets de cet ensemble.
La comparaison de deux objets n'est pas définie au niveau de la classe
Object
. Il y a deux façons de faire pour comparer deux objets.
Comparable
. Cette interface expose une unique méthode :
compareTo(T t)
, qui retourne un entier. Le fait que cet entier soit négatif ou positif nous dit si l'objet comparé est plus grand ou plus petit que notre objet.
SortedSet
, lors de sa construction, une instance de
Comparator
. L'interface
Comparator
n'expose qu'une unique méthode :
compare(T t1, T t2)
, qui a la même sémantique que la méthode
compareTo(T t)
de
Comparable
.
SortedSet
propose les méthodes supplémentaires suivantes.
comparator()
: retourne l'objet instance de
Comparator
qui permet la comparaison, s'il existe.
first()
et
last()
: retournent le plus petit objet de l'ensemble, et le plus grand, respectivement.
headSet(T t)
: retourne une instance de
SortedSet
contenant tous les éléments strictement plus petit que l'élément passé en paramètre. Ce sous-ensemble est une vue sur l'ensemble sur lequel il est construit. Il reflète donc les changements de cet ensemble, et réciproquement.
tailSet(T t)
: retourne une instance de
SortedSet
contenant tous les éléments plus grands ou égaux que l'élément passé en paramètre. Ce sous-ensemble est une vue sur l'ensemble sur lequel il est construit. Il reflète donc les changements de cet ensemble, et réciproquement.
subSet(T inf, T sup)
: retourne une instance de
SortedSet
contenant tous les éléments plus grands ou égaux que
inf
, et strictement plus petits que
sup
. Là encore, ce sous-ensemble est une vue sur l'ensemble sur lequel il est construit, qui reflète donc les changements de cet ensemble, et réciproquement.
String
, implémente
Comparable
, elles peuvent donc être utilisées normalement dans les ensembles triés.
Créons une classe
Marin
qui va nous servir dans notre exemple. Cette classe va être utilisée dans des
Set
, donc elle doit surcharger
equals()
et
hashCode()
.
Exemple 9. Classe
ComparableMarin
public class ComparableMarin implements Comparable<Marin> { // deux champs classiques private String nom, prenom ; // suivent les getters et les setters // suit la surcharge de equals() et de hashCode() // surcharge de toString() public String toString() { // un bonne méthode toString() est une méthode // qui ne fait pas de concaténation de chaîne ! StringBuffer sb = new StringBuffer() ; sb.append(nom).append(" ").append(prenom) ; return sb.toString() ; } // méthode imposée par Comparable<Marin> public int compareTo(Marin m) { // une version complète de cette méthode // doit gérer le cas où nom et prenom sont nuls if (getNom().equals(m.getNom())) { return getPrenom().compareTo(m.getPrenom()) ; } else { return getNom().compareTo(m.getNom()) ; } } }
Exemple 10. Utilisation de
SortedSet
avec des éléments
Comparable
// dans une méthode main SortedSet<ComparableMarin> set = new TreeSet<ComparableMarin>() ; ComparableMarin m1 = new ComparableMarin("Surcouf", "Alain") ; ComparableMarin m2 = new ComparableMarin("Tabarly", "Eric") ; ComparableMarin m3 = new ComparableMarin("Auguin", "Christophe") ; ComparableMarin m4 = new ComparableMarin("Surcouf", "Robert") ; set.add(m1) ; set.add(m2) ; set.add(m3) ; set.add(m3) ; set.add(m4) ; for (ComparableMarin m : set) { System.out.println(m) ; }
Auguin Christophe Surcouf Alain Surcouf Robert Tabarly Eric
Comparable
. Cela peut arriver dans de nombreux cas, notamment si notre classe
Marin
nous est donnée toute faite, sans possibilité de la modifier.
On utilise donc dans cet exemple une classe
Marin
qui n'implémente pas
Comparable
. Voyons comment utiliser un
SortedSet
avec un
Comparator
.
Exemple 11. Utilisation de
SortedSet
avec un
Comparator
// dans une méthode main // définition d'une classe anonyme, implémentation de Comparator<Marin> SortedSet<Marin> set = new TreeSet<Marin>(new Comparator<Marin>() { public int compare(Marin m1, Marin m2) { if (m1.getNom().equals(m2.getNom())) { return m1.getPrenom().compareTo(m2.getPrenom()) ; } else { return m1.getNom().compareTo(m2.getNom()) ; } } }) ; Marin m1 = new Marin("Surcouf", "Alain") ; Marin m2 = new Marin("Tabarly", "Eric") ; Marin m3 = new Marin("Auguin", "Christophe") ; Marin m4 = new Marin("Surcouf", "Robert") ; set.add(m1) ; set.add(m2) ; set.add(m3) ; set.add(m3) ; set.add(m4) ; for (Marin m : set) { System.out.println(m) ; }
Auguin Christophe Surcouf Alain Surcouf Robert Tabarly Eric