You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:50:48