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 gérer n'importe quel type de données dans ces tableaux (à condition qu'ils soient comparables) et vous pouvez trier n'importe quelle colonne dans asc fin ou décroissant.
String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
PS: assurez-vous de vérifier les ArrayIndexOutOfBounds
et d'autres.
EDIT: La solution ci-dessus serait utile que si vous êtes en mesure de stocker en fait un java.util.Date
dans la première colonne ou si votre format de date vous permet d'utiliser la comparaison de chaîne simple pour les valeurs. Sinon, vous devez convertir cette chaîne en date, et vous pouvez le faire en utilisant une interface de rappel (en tant que 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 moment, vous pouvez trier votre première colonne avec:
Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
J'Ignoré vérifie et d'autres problèmes nulls de gestion des erreurs.
Je suis d'accord que cela commence déjà à ressembler à un framework. :)
Dernière (heureusement) éditer: Je réalise seulement maintenant que votre format de date vous permet d'utiliser la comparaison de chaîne simple. Si tel est le cas, vous n'avez pas besoin de la "version améliorée".
simple! Je l'ai essayé et cela a fonctionné comme prévu - merci - marquage comme la bonne réponse – emaillenin
@emaillenin - Je suis heureux que je pourrais aider –
@BertF, Utile. Si je veux comparer dans l'ordre naturel, que dois-je faire? Et +1 pour une bonne réponse. :) –