Recevez les mises à jour gratuites du blog par Email : »» Garanti sans spam indésirable ««

Simulation du ‘Order By’ SQL pour trier une Collection JAVA

de Mimie le 3 mars 2010

Rubrique : Programmation

Exercice

Récupérer une liste de valeurs triée provenant d’une base de données est très simple grâce au mot clé SQL ORDER BY, ex :

[sql]SELECT a,b,c,d,e,f FROM ma_table ORDER BY a,c,e[/sql]

Qu’en est-il en Java pour trier nos listes de façon multiple ? Existe-t’il un tel mot clé ? non bien entendu. Cet article va vous présenter une façon de procéder en utilisant les méthodes sort() de la classe java.util.Collections ainsi qu’une classe de comparaison java.util.Comparator qui nous permettront ensemble d’appliquer des tris successifs à nos listes de type java.util.Collection (List, Vector, etc.).

Tri multiple

Tri unique

Si vous souhaitez trier votre liste de façon unique (tri par défaut), il suffit d’utiliser la méthode Collections.sort(votre_liste_dobjets) en considérant que les éléments de votre liste soient de type java.lang.Comparable, voici un exemple rapide :

[java]
public class Essai {

public static void main(String[] args) {
List<VotreClasse> list = new ArrayList<VotreClasse>();
list.add(new VotreClasse("caméléon"));
list.add(new VotreClasse("uranium"));
list.add(new VotreClasse("pays"));
list.add(new VotreClasse("dentiste"));

Collections.sort(list);

for (VotreClasse vc : list) {
System.out.println(vc.getAttribut());
}
}
}

class VotreClasse implements Comparable<VotreClasse> {
private String attribut;

public VotreClasse(String attribut) {
this.attribut = attribut;
}

public int compareTo(VotreClasse classeToCompare) {
return attribut.compareTo(classeToCompare.attribut);
}

public String getAttribut() {
return attribut;
}
}
[/java]

Résultat

[plain]
caméléon
dentiste
pays
uranium
[/plain]

Tris multiple

Contrairement au tri unique où l’interface Comparable suffit, appliquer plusieurs tris successifs est un peu plus compliqué, pour cela il vaut mieux utiliser une classe de comparaison de type Comparator, celle-ci, beaucoup plus souple, va nous permettre d’appliquer nos tris entre deux objets, exemple :

  • Classe de comparaison qui permet de trier par power puis par thougness puis par rarity puis par name (ORDER BY power, thoungess, rarity, name) :

[java]
public class CardPowerComparator implements Comparator<CardRemote> {

public int compare(CardRemote card1, CardRemote card2) {
int powerCompare = card1.getPower().compareTo(card2.getPower());
int thougnessCompare = card1.getThougness().compareTo(card2.getThougness());
int nameCompare = card1.getName().compareTo(card2.getName());
int rarityCompare = card1.getRarity().getOrder().compareTo(card2.getRarity().getOrder());

int compared = powerCompare;
if (compared == 0) {
compared = thougnessCompare;
if (compared == 0) {
compared = rarityCompare;
if (compared == 0) {
compared = nameCompare;
}
}
}

return compared;
}
}
[/java]

  • Classe de vos objets à trier :

[java]
public class CardRemote {

private String name;
private String power;
private String thougness;
private RarityRemote rarity;

// getters and setters</pre>
}
[/java]

  • Appel du tri :

[java]
List<CardRemote> cardsRemoteList = … ;
Collections.sort(cardsRemoteList, new CardAllComparator());
[/java]

Cet article a été écrit par :

– qui a déjà rédigé 123 posts sur Des Geeks et des lettres.

Passionné d'informatique et développeur JavaEE de métier, je me consacre principalement à écrire des billets sur les sujets du Web et de la programmation Web. Ce blog est un espace qui me permet de partager mes découvertes avec vous et me sert accessoirement de pense bête !

Contacter l'auteur

Jetez aussi un oeil sur :

{ 1 commentaire… à vous de vous exprimer ! }

1 Greg mars 4, 2010 à 13 h 11 min

Thx pour l’article – Ding !

Répondre

Laissez un Commentaire

Article précédent:

Article suivant: