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 esta manera puede manejar cualquier tipo de datos en esas matrices (siempre y cuando sean Comparables) y puede ordenar cualquier columna en asc orden final o descendente.
String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
PS: asegúrese de comprobar para ArrayIndexOutOfBounds
y otros.
EDIT: La solución anterior sólo sería útil si usted es capaz de almacenar una realidad java.util.Date
en la primera columna o si su formato de fecha permite el uso de comparación de cadenas sin formato para esos valores. De lo contrario, debe convertir esa cadena en una fecha, y puede lograr eso usando una interfaz de devolución de llamada (como una solución general). Aquí está una versión mejorada:
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);
}
}
}
Y en este punto, se puede ordenar en su primera columna con:
Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
me he saltado los controles para los nulos y otros asuntos de manejo de errores.
Acepto que esto ya empieza a parecer un framework. :)
Última edición (afortunadamente): ahora me doy cuenta de que el formato de fecha le permite utilizar la comparación de cadena simple. Si ese es el caso, no necesita la "versión mejorada".
simple! Lo probé y funcionó como se esperaba - gracias - marcando como la respuesta correcta – emaillenin
@emaillenin - Me alegro de poder ayudar –
@BertF, útil. Si quiero comparar en orden natural, ¿qué debo hacer? Y +1 por buena respuesta. :) –