我有一个类型A的项目列表,它们是与日常相关的项目,如下所示
实际
List[
A{id:1,parentId:1}
A{id:2,parentId:1}
A{id:3,parentId:1}
A{id:4,parentId:1}
A{id:6,parentId:2}
A{id:7,parentId:6}
]
我需要按以下方式对其进行排序。我试着用比较器,但确实很复杂。我不确定是否必须使用treesort或任何其他算法来解决此问题。谢谢。
必需
List[
A{id:1,parentId:1}
A{id:2,parentId:1}
A{id:6,parentId:2}
A{id:7,parentId:6}
A{id:3,parentId:1}
A{id:4,parentId:1}
]
正如您所看到的那样,层次结构项都被排序到开头(不需要在开头),但必须在列表中。
答案 0 :(得分:1)
<强>更新强>
您应该使用深度搜索算法,例如described here。
此图片说明了如何获得所需订单的想法:
在伪代码中很简单,这里是深度搜索算法的 排序版 :
_items[] depthSort (_parent){
add _parent to _items[];
get _children of _parent sorted by desired attribute;
for every _item in _children
depthSort(_item);
}
答案 1 :(得分:1)
我有点困惑。您说您希望它按层次结构(parentIds)分组排序。但是你的必需输出有你的&#34; parentId:1&#34;小组分成两个?
如果您希望将父母分组,那么您的所需输出中就会出现错误。
---更新---
好的,所以你不希望你的分类按父母分组,你希望它是深度优先排序。
recursiveDepthFirstWalk(List<Node> sorted, Node parent);
if (parent != null) {
sorted.add(parent);
}
List<Node> children = parent.getChildren();
sort(children);
for (Child child : children) {
recursiveDepthFirstPrint(sorted, child);
}
}
请注意,有更好的实现这个想法。