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

Groovy脚本问题:如何提取数组中的重复项至新数组

Groovy找出数组中的重复条目并收集到新数组

原代码存在的问题

  • 内层循环计数器初始化位置错误:j和x都定义在外层循环外,导致外层循环仅第一次迭代时内层循环能正常执行,后续迭代时计数器已到达数组末尾,无法继续比较。
  • 死循环风险:第一个while循环中仅当元素不相等时才递增j,若遇到相等元素,j不会变化,会一直卡在当前位置循环。
  • 语法错误:第二个for循环中使用result.add[x]的数组访问语法,正确的方法调用应为result2.add(list[x])。
  • 目标数组未正确使用:第二个循环中应该往result2添加元素,但代码里错误操作了result。

修正后的嵌套循环实现

修正While循环版本

def list = [1,2,3,4,5,6,7,8,9,10,10,10]
def result = []

def i = 0
while (i < list.size()) {
    // 每次外层循环重置j为当前索引的下一位,避免重复比较
    def j = i + 1
    while (j < list.size()) {
        if (list[j] == list[i]) {
            result.add(list[j])
        }
        // 无论是否匹配,都递增j,避免死循环
        j++
    }
    i++
}

log.info("修正后While迭代结果: ${result}")
// 输出: 修正后While迭代结果: [10, 10, 10]

修正For循环版本

def list = [1,2,3,4,5,6,7,8,9,10,10,10]
def result2 = []

for (int idx = 0; idx < list.size(); idx++) {
    def current = list[idx]
    // 从当前索引的下一位开始比较
    def x = idx + 1
    while (x < list.size()) {
        if (current == list[x]) {
            result2.add(list[x])
        }
        x++
    }
}

log.info("修正后For迭代结果: ${result2}")
// 输出: 修正后For迭代结果: [10, 10, 10]

更高效的频率统计实现

如果不想用嵌套循环,可通过统计元素出现频率的方式快速收集重复项,同样不使用unique()方法:

def list = [1,2,3,4,5,6,7,8,9,10,10,10]
// 用Map统计每个元素的出现次数
def frequencyMap = [:].withDefault { 0 }
list.each { element ->
    frequencyMap[element]++
}

// 收集所有出现次数超过1次的元素实例
def duplicates = list.findAll { frequencyMap[it] > 1 }
log.info("频率统计法结果: ${duplicates}")
// 输出: 频率统计法结果: [10, 10, 10]

// 若仅需要去重后的重复元素(不使用unique())
def uniqueDuplicates = frequencyMap.findAll { it.value > 1 }.keySet().toList()
log.info("去重后的重复元素: ${uniqueDuplicates}")
// 输出: 去重后的重复元素: [10]

内容的提问来源于stack exchange,提问作者Lucian Al-Zafari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:30:50