下面是文件列表:
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(","))
答案 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
答案 1 :(得分:1)
为乐趣的替代(因为有很多方法可以做到的事情在Groovy)
println parsedList.groupBy { it.split(/_\d{4}_/).head() }
.collect { k, v -> v.sort().last() }