отличная сортировка списка с использованием части элемента списка

#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 цифр.