Groovy如何从两个列表筛选符合指定扩展名的路径列表?
解决方案:筛选符合指定扩展名的路径列表
首先修正你的代码中路径字符串的语法问题——Groovy中字符串必须用引号包裹,否则会报错:
def AllowedExtensions = [ '.mxf', '.mov', '.mp4'] def myPaths = [ 'C:\\Temp\\Media\\Media.c2v', 'C:\\Temp\\Media\\Media.V2C', 'C:\\Temp\\Media\\toto\\test\\巨塔の終わり.mp4', 'C:\\Temp\\Media\\toto\\toto.mxf' ]
正确的筛选实现
你之前的代码错误在于findAll的闭包没有做任何过滤逻辑,且each循环会反复覆盖结果变量。以下是两种Groovy风格的可行方案:
方案一:利用Groovy的File类处理扩展名
通过File类的getExtension()方法直接获取扩展名,结合大小写统一避免匹配失败:
// 将允许的扩展名转为小写集合,兼容大小写差异 def allowedExts = AllowedExtensions.collect { it.toLowerCase() } def mySelectedPath = myPaths.findAll { path -> // 获取路径的扩展名并转为小写,拼接成带点的格式匹配允许列表 def fileExt = new File(path).getExtension().toLowerCase() allowedExts.contains(".$fileExt") }
方案二:手动截取扩展名(无需File类)
直接从字符串中截取最后一个.后的部分,用Set提升查询效率:
// 转为Set集合,查询性能更优 def allowedExtsSet = AllowedExtensions*.toLowerCase() as Set def mySelectedPath = myPaths.findAll { path -> int lastDotPos = path.lastIndexOf('.') // 没有扩展名的路径直接排除 if (lastDotPos == -1) return false // 截取扩展名部分(包含点)并转小写 def ext = path.substring(lastDotPos).toLowerCase() allowedExtsSet.contains(ext) }
执行结果
运行上述代码后,mySelectedPath会得到你期望的结果:
['C:\\Temp\\Media\\toto\\toto.mxf', 'C:\\Temp\\Media\\toto\\test\\巨塔の終わり.mp4']
(注:你期望结果中的MediaNavigator应为笔误,实际对应原路径中的Media)
内容的提问来源于stack exchange,提问作者Matthieu Ducorps
相关产品推荐
相关产品推荐

