Groovy遍历ArrayList,合并同名someData元素的字段
问题解决方案
原定义类
class someData{ def name def type def minVal}
数据读取代码
def dataHolder = new ArrayList() dataHolder.add(new someData( name: "", type:"", minVal:"" ))
注:上述空字符串实际由Excel文件中按逗号分割的数据填充,最终
dataHolder结构如下:
dataHolder[0]--> name: name1, type:int, minVal:8 dataHolder[1]--> name: name2, type:int, minVal:11 dataHolder[2]--> name: name3, type:int, minVal:8 dataHolder[3]--> name: name4, type:uint32, minVal:8 dataHolder[4]--> name: name4, type:double, minVal:155 dataHolder[5]--> name: name4, type:float, minVal:48 dataHolder[6]--> name: name5, type:long, minVal:2855
需求
遍历dataHolder并生成新列表newArrList,规则如下:
- 若当前索引[i]的
name与[i+1]不同,直接将该元素加入新列表; - 若
name相同,合并对应元素的type和minVal字段。
最终期望的newArrList结构:
newArrList[0]--> name: name1, type:int, minVal:8 newArrList[1]--> name: name2, type:int, minVal:11 newArrList[2]--> name: name3, type:int, minVal:8 newArrList[3]--> name: name4, type:uint32,double,float minVal:8,155,48 newArrList[4]--> name: name5, type:long, minVal:2855
允许的修改
仅可将someData类修改为集合字段版本:
class someData{ def name = new ArrayList() def type = new ArrayList() def minVal = new ArrayList() }
实现代码
1. 更新someData类
先替换为允许的集合类型定义:
class someData{ def name = new ArrayList() def type = new ArrayList() def minVal = new ArrayList() }
2. 遍历合并逻辑
def newArrList = new ArrayList() if(dataHolder.isEmpty()) { return newArrList } // 初始化第一个待合并元素 def currentItem = new someData() currentItem.name.add(dataHolder[0].name) currentItem.type.add(dataHolder[0].type) currentItem.minVal.add(dataHolder[0].minVal) for(int i = 1; i < dataHolder.size(); i++) { def item = dataHolder[i] if(item.name == currentItem.name[0]) { // name相同,合并type和minVal currentItem.type.add(item.type) currentItem.minVal.add(item.minVal) } else { // name不同,将当前合并完成的元素加入新列表,初始化新的待合并元素 newArrList.add(currentItem) currentItem = new someData() currentItem.name.add(item.name) currentItem.type.add(item.type) currentItem.minVal.add(item.minVal) } } // 加入最后一个待合并元素 newArrList.add(currentItem)
3. 格式转换(可选)
如果需要将集合字段转为逗号分隔的字符串(与期望输出格式完全匹配),可执行以下处理:
newArrList.each { item -> item.name = item.name[0] // 合并后name集合仅存一个值,直接取单个元素 item.type = item.type.join(',') item.minVal = item.minVal.join(',') }
内容的提问来源于stack exchange,提问作者seplo
相关产品推荐
相关产品推荐

