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
相关产品推荐
相关产品推荐

