public interface IStringRowsListSorter { /** * Сортирует переданный список записей (каждая запись - набор колонок) таблицы по указанной колонке по следующим правилам: * <ul> * <li>в колонке могут быть null и пустые значения - строки с null-значениями должны быть первыми, затем строки с пустым значением, затем все остальные,</li> * <li>строка бьется на подстроки следующим образом: выделяем непрерывные максимальные фрагменты строки, состоящие только из цифр, и считаем набором подстрок эти фрагменты и все оставшиеся от такого разбиения фрагменты строки</li> * <li>при сравнении строк осуществляется последовательное сравнение их подстрок до первого несовпадения,</li> * <li>если обе подстроки состоят из цифр - то при сравнении они интерпретируются как целые числа (вначале должно идти меньшее число), в противном случае - как строки,</li> * <li>сортировка должна быть устойчива к исходной сортировке списка - т.е., если строки (в контексте указанных правил сравнения) неразличимы, то сортировка не должна менять их местами.</li> * </ul> * * @param rows список записей таблицы (например, результат sql select), которые нужно отсортировать по указанной колонке * @param columnIndex индекс колонки, по которой нужно провести сортировку */ void sort(List<String[]> rows, int columnIndex); } An implementation of the class in which the interface is inherited. But only the lines are compared. It is not entirely clear how to implement a comparison / ordering of substrings. It is clear that you need to use String methods, but how to implement it so that it is sorted in the required order?
public void sort(final List<String[]> rows, final int columnIndex) { Collections.sort(rows, new Comparator<String[]>() { @Override public int compare(String[] o1, String[] o2) { return o1[columnIndex].compareTo(o2[columnIndex]); } }); }