如何按Id升序后将父ID匹配的对象紧邻对应Id排列?
这个层级排序的需求挺典型的,我帮你梳理下实现逻辑,不管你用Python、Java还是其他编程语言,核心思路都是通用的:
实现步骤拆解
1. 先明确排序规则的核心逻辑
你的需求本质是**「先按顶级元素的Id升序排列,再让每个顶级元素的直接子元素紧跟其后(子元素自身也按Id升序)」**——这里的顶级元素指的是ParentId为null或者0的条目(从你的示例能看出来这两类都是顶层节点)。
2. 预处理:建立父-子映射表
首先把所有元素按ParentId分组,方便后续快速找到某个父元素对应的子元素。同时要确保每个子元素列表本身是按Id升序排好的。
# 伪代码(Python风格) original_list = [ {"Id":751, "ParentId":None}, {"Id":752, "ParentId":0}, {"Id":753, "ParentId":751}, {"Id":754, "ParentId":None}, {"Id":755, "ParentId":754}, {"Id":756, "ParentId":0} ] # 构建父Id到子元素的映射 parent_map = {} for item in original_list: parent_id = item["ParentId"] if parent_id not in parent_map: parent_map[parent_id] = [] parent_map[parent_id].append(item) # 给每个子元素列表按Id升序排序 for key in parent_map: parent_map[key].sort(key=lambda x: x["Id"])
3. 生成最终排序后的列表
先把所有顶级元素(ParentId为None或0)挑出来,按Id升序排列;然后逐个遍历顶级元素,先把它加入结果列表,再紧接着加入它的所有子元素(如果有的话)。
sorted_list = [] # 筛选顶级元素并按Id升序排序 top_level_items = [item for item in original_list if item["ParentId"] is None or item["ParentId"] == 0] top_level_items.sort(key=lambda x: x["Id"]) # 遍历顶级元素,添加自身和子元素 for item in top_level_items: sorted_list.append(item) # 取出当前元素的子元素(没有的话返回空列表) child_items = parent_map.get(item["Id"], []) sorted_list.extend(child_items) # 输出结果就是你想要的 print(sorted_list)
4. 验证结果
用你的示例数据跑上面的逻辑,得到的结果正好是:
[ {"Id":751, "ParentId":None}, {"Id":753, "ParentId":751}, {"Id":752, "ParentId":0}, {"Id":754, "ParentId":None}, {"Id":755, "ParentId":754}, {"Id":756, "ParentId":0} ]
扩展:支持更深层级的嵌套
如果你的数据有多层级嵌套(比如子元素还有自己的子元素),只需要把添加子元素的逻辑改成递归即可:
def add_item_and_children(item, result_list, parent_map): result_list.append(item) child_items = parent_map.get(item["Id"], []) for child in child_items: add_item_and_children(child, result_list, parent_map) # 调用递归函数处理顶级元素 sorted_list = [] for item in top_level_items: add_item_and_children(item, sorted_list, parent_map)
内容的提问来源于stack exchange,提问作者refresh
相关产品推荐
相关产品推荐

