2011-12-15 3 views
2

J'ai cette classe:commander une collection par autre façon

public class Paint implements Comparable<Paint>{ 

    private String cod_paint; 
    private String title_paint; 
    private String author; 
    private int year; 

    public Paint(String cod_paint,String title_paint,String author,int year){ 

    this.cod_paint = cod_paint; 
    this.title_paint = title_paint; 
    this.author = author; 
    this.year = year; 
    } 

    /* And follow get method */ 

} 

Maintenant, je voudrais créer une peinture d'objets et de les insérer dans une collection par exemple ArrayList

après que je dois trier cette collection une fois par author, une autre fois year et une autre fois pour cod_paint.

Pour ce faire, je dois mettre en œuvre à l'intérieur de la peinture la méthode compareTo

Par exemple:

public int compareTo(Paint p){ 

    return cod_paint.compareTo(p.cod_paint); 
} 

de cette manière quand je vais utiliser la méthode sort sur mon ArrayList<Paint> ce sera par ordre cod_paint. Mais maintenant comment puis-je mettre en œuvre l'autre façon de commander (par auteur, par année) dans la même méthode comparer à?

Répondre

2

Si vous avez besoin d'ordres de tri différents, il est plus facile d'implémenter plusieurs comparateurs (Comparator<Paint>) et de passer le code approprié à la fonction sort().

Cela peut aussi se faire en ligne en utilisant des classes anonymes:

Collections.sort(my_list, new Comparator<Paint>() { 
    public int compare(Paint o1, Paint o2) { ... } 
    boolean equals(Object obj) { ... } 
}); 
10

Ne pas utiliser Comparable, utilisez une coutume Comparator à la place. Je vais avec un ENUM de Comparator s:

public enum PaintComparator implements Comparator<Paint>{ 
    BY_NAME{ 
     @Override 
     public int compareTo(Paint left, Paint right){ 
      return left.getAuthor().compareTo(right.getAuthor()); 
     } 
    }, 
    // more similar items here 
} 

utilise maintenant comme suit:

List<Paint> myList = // init list here 
Collections.sort(myList, PaintComparator.BY_NAME); 

Voir:

+0

(+1) Belle technique! Les deux composants sont assez communs, mais je ne les ai jamais vus combinés de cette façon. – NPE

+0

mais je dois ajouter à ma class aussi Comparable ? – Mazzy

+0

@Mazzy non, uniquement si vous n'utilisez pas de comparateur personnalisé. –

Questions connexes