class ArrayComparator implements Comparator<Comparable[]> {
private final int columnToSort;
private final boolean ascending;
public ArrayComparator(int columnToSort, boolean ascending) {
this.columnToSort = columnToSort;
this.ascending = ascending;
}
public int compare(Comparable[] c1, Comparable[] c2) {
int cmp = c1[columnToSort].compareTo(c2[columnToSort]);
return ascending ? cmp : -cmp;
}
}
De cette façon, vous pouvez manipuler n'importe quel type de données dans ces tableaux (tant qu'ils sont comparables) et vous pouvez trier n'importe quelle colonne dans l'ordre croissant ou décroissant.
String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
PS : assurez-vous de vérifier ArrayIndexOutOfBounds
et autres.
EDIT : La solution ci-dessus ne serait utile que si vous êtes en mesure de stocker réellement un java.util.Date
dans la première colonne ou si votre format de date vous permet d'utiliser une simple comparaison de chaînes de caractères pour ces valeurs. . Sinon, vous devez convertir cette chaîne en une date, et vous pouvez le faire en utilisant une interface de rappel (comme solution générale). Voici une version améliorée :
class ArrayComparator implements Comparator<Object[]> {
private static Converter DEFAULT_CONVERTER = new Converter() {
@Override
public Comparable convert(Object o) {
// simply assume the object is Comparable
return (Comparable) o;
}
};
private final int columnToSort;
private final boolean ascending;
private final Converter converter;
public ArrayComparator(int columnToSort, boolean ascending) {
this(columnToSort, ascending, DEFAULT_CONVERTER);
}
public ArrayComparator(int columnToSort, boolean ascending, Converter converter) {
this.columnToSort = columnToSort;
this.ascending = ascending;
this.converter = converter;
}
public int compare(Object[] o1, Object[] o2) {
Comparable c1 = converter.convert(o1[columnToSort]);
Comparable c2 = converter.convert(o2[columnToSort]);
int cmp = c1.compareTo(c2);
return ascending ? cmp : -cmp;
}
}
interface Converter {
Comparable convert(Object o);
}
class DateConverter implements Converter {
private static final DateFormat df = new SimpleDateFormat("yyyy.MM.dd hh:mm");
@Override
public Comparable convert(Object o) {
try {
return df.parse(o.toString());
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
}
Et à ce stade, vous pouvez trier sur votre première colonne avec :
Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
J'ai ignoré les vérifications des nuls et autres problèmes de gestion des erreurs.
Je suis d'accord pour dire que cela commence déjà à ressembler à un cadre :)
Dernière modification (si tout va bien) : je réalise seulement maintenant que votre format de date vous permet d'utiliser une simple comparaison de chaînes. Si c'est le cas, vous n'avez pas besoin de la "version améliorée".