группа по имени и выберите самую последнюю по дате в имени файла - PullRequest
0 голосов
/ 01 февраля 2019

ниже приведен список файлов:

abc_2019_01_30_5816789.bak, abc_2019_01_31_2992794.bak, 
xyz_2019_01_26_4690992.bak, xyz_2019_01_27_8319704.bak, 
pqr_2019_01_30_5986789.bak, pqr_2019_01_31_3142809.bak, 
test_2019_01_30_6076789.bak, test_2019_01_31_3232818.bak, 
testing_2019_01_30_6026789.bak, testing_2019_01_31_3192814.bak, 
repair_2019_01_30_6116789.bak, repair_2019_01_31_3282823.bak, 
factory_2019_01_30_5646789.bak, factory_2019_01_31_2802775.bak

У меня есть этот список в "parsedlist", поэтому, когда я сортирую их и выбираю последние 7, я вижу пару дубликатов файлов.Мое требование - иметь 7 уникальных файлов, которые являются самыми последними, и записать их в текстовый файл.Я попробовал следующий код:

List<String> sortedList = parsedList.sort(false).reverse()
println sortedList.take(7)
String filename = "D:\\latest.txt"
new File(filename).write(sortedList.take(7).join(","))

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Альтернатива для развлечения (так как в Groovy есть много способов сделать что-то)

println parsedList.groupBy { it.split(/_\d{4}_/).head() }
    .collect { k, v -> v.sort().last() }
0 голосов
/ 01 февраля 2019

Вы просто сортируете список по полному имени файла, которое сначала дает вам все файлы "xyz", а затем "тестирование" и так далее ...

Одним из способов будет использование groupByсначала сгруппировать файлы по префиксу, затем отсортировать каждую группу и, наконец, выбрать последний элемент из каждой группы.

println parsedList
    .groupBy{it[0..-24]} // group by prefix (remove timestamp), results in a map like [abc:['abc_2019_...', 'abc_2019_...'], xyz:[...], ...]
    .values() // collect the values from the KeyValuePairs (i.e. just the lists with the strings) --> [['abc_2019_...', 'abc_...'], ['xyz_...','xyz_...'], ...]
    *.sort() // sort each of the lists
    *.getAt(-1) // from each list take the last item

Groovy веб-консоль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...