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

