#groovy
#отличная
Вопрос:
У меня есть список, который выглядит следующим образом:
C:basedir2011_Aprildata_20110407.csv
...
C:basedir2011_Januarydata_20110101.csv
Второй файл находится позже в списке, потому что «Январь» идет после «апреля». Вместо этого мне нужно, чтобы этот список был отсортирован по дате файла, т. Е. файл data_20110101.csv должен предшествовать файлу data_20110407.csv (сохраняя полный путь к каталогу). Может ли кто-нибудь привести мне пример, который может выполнять сортировку по подполям, подобным этому?
Ответ №1:
Вы можете использовать метод сортировки в списке и передать замыкание, которое извлекает дату из каждой строки в качестве критерия сортировки:
fileList.sort {
def matcher = it =~ /(d{8}).csv/
matcher[0][1]
}
Комментарии:
1. Спасибо, Кристоф, я все еще перевариваю синтаксис, когда пытаюсь это сделать, но получил ошибку: Class java.lang. Сообщение об исключении IndexOutOfBoundsException: индекс находится вне диапазона 0 ..-1 (index = 0) println FileList FileList.sort { def matcher = it =~ /(d{8}).csv/ matcher[0][1] }
2. Все, что gobly gook StackOverflow поместил в одну строку, в точности соответствует вашему синтаксису, то есть разделено строками.
3. Что ж, похоже, что по крайней мере один элемент в списке не соответствует шаблону регулярных выражений (8 цифр, за которыми следует «.csv»). Если это так, вы сталкиваетесь с исключением IndexOutOfBoundsException. Вы можете проверить, прежде чем обращаться к соответствующей группе,
if (matcher.length > 0)
но вам нужны альтернативные критерии сортировки на случай, если во входной строке нет подстроки даты.4. Понятно, спасибо за это. Можете ли вы рассказать мне о значении включения сопоставителя[0][1] внутрь? Я попытался удалить это, используя пример «правильных элементов», и это все еще работало.
5. сопоставитель [0] выдаст вам первое совпадение для данного шаблона. сопоставитель[0][0] выдаст вам полную строку, соответствующую шаблону. сопоставитель[0][1] выдаст вам только часть группы регулярных выражений, которая определяется круглыми скобками в шаблоне, то есть только 8 цифр.