import java.text.DateFormat; import java.util.Comparator; import java.util.Locale; import java.util.Date; public class Etudiant implements Comparable{ // Étudiant avec comparaison "naturelle" // sans s'occuper de la date... private String nom, prenom; private Date inscription; static DateFormat fd = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.FRENCH); Etudiant(String prenom, String nom, Date inscription){ if (nom==null || prenom==null) throw new NullPointerException(); this.nom = nom; this.prenom = prenom; this.inscription = inscription; } public String toString(){ return prenom +" "+nom +" inscrit le "+fd.format(inscription); } // la date ne compte pas dans la comparaison... // ce sera donc la premiere inscription qui comptera public boolean equals(Object that) { if(that==this) return true; if(!(that instanceof Etudiant)) return false; Etudiant e = (Etudiant)that; return e.prenom.equals(prenom) && e.nom.equals(nom); } public int hashCode() { return 31*prenom.hashCode() + nom.hashCode(); } // comparaison sur le nom et ensuite le prénom public int compareTo(Etudiant that) { if(that==this) return 0; if(that==null) throw new NullPointerException(this+" comparé avec null"); int nomCmp = nom.compareTo(that.nom); return (nomCmp!=0 ? nomCmp : prenom.compareTo(that.prenom)); } // comparaison par la date puis par le nom et prénom public static final Comparator parDateInscription = new Comparator(){ public int compare(Etudiant e1,Etudiant e2){ if(e1==e2) return 0; int dateCmp = e1.inscription().compareTo(e2.inscription()); return dateCmp!=0 ? dateCmp : e1.compareTo(e2); } }; // méthodes d'accés public String prenom(){return prenom;} public String nom(){return nom;} public Date inscription(){return inscription;} }