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

groovy按名称分组,并在文件名中选择最新的按日期,groovy,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_201

以下是文件列表:

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(","))
List-sortedList=parsedList.sort(false).reverse()
println-sortedList.take(7)
String filename=“D:\\latest.txt”
新文件(文件名).write(sortedList.take(7).join(“,”))

您只需按完整文件名对列表进行排序,这将首先为您提供所有“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

您只需按完整文件名对列表进行排序,这将首先为您提供所有“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中有很多方法)

一个有趣的替代方案(因为在Groovy中有很多方法)


我只是好奇,如果文件名像“abc_生产_备份__2019_01_30_5816789.bak”,那么group by也应该是一样的。正则表达式替换只删除尾随的时间戳。由于时间戳的长度始终相同,我们甚至不需要正则表达式,只需删除最后23个字符即可。我已经更新了答案(和web控制台链接)以反映这一点。我只是好奇,如果文件名像“abc_生产_备份_2019_01_30_5816789.bak”,那么group by也应该是一样的。正则表达式替换只删除尾随的时间戳。由于时间戳的长度始终相同,我们甚至不需要正则表达式,只需删除最后23个字符即可。我已经更新了答案(和web控制台链接)以反映这一点。