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;
}
}
Таким образом, вы можете обрабатывать данные любого типа в этих массивах (если они сопоставимы) и сортировать любой столбец в порядке возрастания или убывания.
String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
PS: убедитесь, что вы проверили ArrayIndexOutOfBounds
и другие.
РЕДАКТИРОВАТЬ: Приведенное выше решение будет полезно только в том случае, если вы действительно можете сохранить java.util.Date
в первом столбце или если ваш формат даты позволяет вам использовать сравнение строк в этих значениях . В противном случае вам нужно преобразовать эту строку в дату, и вы можете добиться этого, используя интерфейс обратного вызова (как общее решение). Вот расширенная версия:
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);
}
}
}
И на этом этапе вы можете отсортировать первый столбец с помощью:
Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
Я пропустил проверки на нулевые значения и другие проблемы с обработкой ошибок.
Я согласен, это уже начинает выглядеть как фреймворк. :)
Последнее (надеюсь) редактирование: я только сейчас понимаю, что ваш формат даты позволяет вам использовать простое сравнение строк. В таком случае вам не нужна «улучшенная версия».