Groovy中如何按对象name属性自定义规则排序ArrayList
Groovy 自定义优先级列表排序实现
核心思路是为每个name值匹配对应的排序权重,权重值越小排序越靠前,逻辑直白易调整,非常适合刚接触Groovy的新手理解。
实现步骤
- 先定义优先级权重映射表:
Max权重设为0,对应最高优先级Sam权重设为1,对应第二优先级John权重设为2,对应第三优先级- 所有未匹配到以上三个值的name(包括纯空格、空值、其他任意内容)统一分配权重3,排在列表最后
- 调用Groovy集合内置的
sort方法,提取每条记录name对应的权重值作为排序依据即可。
注:Groovy的内置sort是稳定排序,同权重的记录会保留原列表中的相对顺序,不需要额外做兼容处理。
完整可运行代码
// 原始对象列表 def userList = [ ["name": "John", "gender": "Male", "id": "1"], ["name": "Max", "gender": "Male", "id": "2"], ["name": "John", "gender": "Male", "id": "3"], ["name": "Sam", "gender": "Male", "id": "4"], ["name": "Max", "gender": "Male", "id": "5"], ["name": "Sam", "gender": "Male", "id": "6"], ["name": "Sam", "gender": "Male", "id": "7"], ["name": " ", "gender": "Male", "id": "8"], ["name": "John", "gender": "Male", "id": "9"], ["name": " ", "gender": "Male", "id": "10"], ] // 排序优先级映射表 def namePriority = [ "Max": 0, "Sam": 1, "John": 2 ] // 未匹配到映射规则的统一使用的默认权重 def defaultWeight = 3 // 执行排序 def sortedResult = userList.sort { item -> // 对name做空值、空格兼容处理,避免纯空格、null值导致匹配异常 def validName = item.name?.trim() ?: "" namePriority.get(validName, defaultWeight) }
排序效果验证
运行代码后得到的列表顺序完全匹配需求:
- 最前面是所有name为Max的记录(id为2、5)
- 接着是所有name为Sam的记录(id为4、6、7)
- 再往后是所有name为John的记录(id为1、3、9)
- 最后是name为纯空格的记录(id为8、10)
如果后续需要调整排序优先级,只需要修改namePriority映射表中的权重数值即可,不需要改动核心排序逻辑。
内容的提问来源于stack exchange,提问作者brig
相关产品推荐
相关产品推荐

