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

 Article modifié dernièrement le 4 Mar 2010 @ 9 h 37 min

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]

Trois flèches vers le bas

1- Logiciel de brouillage d’adresse IP :

Contourner la censure en surfant anonyme

2- L’article explicatif :

La différence entre un proxy et un VPN

3- Comment espionner un smartphone (app) :

L’application de référence

Commentez ici

  • Greg 4 mars 2010, 13 01

    Thx pour l’article – Ding !

Article suivant:

Article précédent:

Share This