按名称对groovy分组,并按文件名选择最新日期

时间:2019-02-01 08:00:11

标签: groovy

下面是文件列表:

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 :(得分:1)

您只是按完整文件名对列表进行排序,这将首先为您提供所有“ xyz”文件,然后是“ testing”,依此类推...

一种方法是使用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 web console

答案 1 :(得分:1)

为乐趣的替代(因为有很多方法可以做到的事情在Groovy)

println parsedList.groupBy { it.split(/_\d{4}_/).head() }
    .collect { k, v -> v.sort().last() }