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

Groovy列表存在重复元素时如何获取遍历元素的正确索引

解决方法

你遇到的问题根源是遍历元素时调用indexOf()获取索引,遇到重复值时只会返回第一个匹配项的索引,正确的做法是遍历过程中直接获取当前元素的索引,不需要额外查询。

方案1:使用Groovy内置eachWithIndex遍历(推荐,符合Groovy语法风格)

// 提前定义食物名称与索引的对应关系
def foodNames = ["Cake", "Custard", "Donuts"]
def availFood = ["${property['Cake']}", "${property['Custard']}", "${property['Donuts']}"]

// 同时获取当前元素值和对应索引
availFood.eachWithIndex { currentFood, index ->
    // 注意你原代码这里少写了右括号,调整时记得补上
    if (currentFood == "true") {
        def foodName = foodNames[index]
        println("Our current food is ${foodName}!")
        // 此处添加你需要执行的其他操作逻辑
    }
}

方案2:用for循环直接遍历索引

如果你更习惯传统for循环的写法,可以直接遍历列表的索引范围,通过索引取元素值和对应的食物名称:

def foodNames = ["Cake", "Custard", "Donuts"]
def availFood = ["${property['Cake']}", "${property['Custard']}", "${property['Donuts']}"]

for (int i = 0; i < availFood.size(); i++) {
    if (availFood[i] == "true") {
        def foodName = foodNames[i]
        println("Our current food is ${foodName}!")
        // 此处添加你需要执行的其他操作逻辑
    }
}

优化建议

简化布尔值判断

你当前availFood里存的是字符串格式的"true"/"false",如果直接存原始布尔值,判断逻辑会更简洁:

// 去掉字符串模板包裹,直接存布尔值
def availFood = [property['Cake'], property['Custard'], property['Donuts']]
// 判断时直接写变量即可
if (currentFood) {
    // 逻辑
}

用Map存储更易维护

如果后续可能新增食物类型,推荐直接用Map存储食物名称和可用状态的对应关系,不需要维护两个列表的索引对齐:

def foodStatus = [
    "Cake": property['Cake'],
    "Custard": property['Custard'],
    "Donuts": property['Donuts']
]

foodStatus.each { foodName, isAvailable ->
    if (isAvailable) {
        println("Our current food is ${foodName}!")
        // 其他操作逻辑
    }
}

内容的提问来源于stack exchange,提问作者croakPedlar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:39:03