将分层相关的数据排序在一起

时间:2014-11-12 21:02:40

标签: java java1.4

我有一个类型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}
]

正如您所看到的那样,层次结构项都被排序到开头(不需要在开头),但必须在列表中。

2 个答案:

答案 0 :(得分:1)

<强>更新
您应该使用深度搜索算法,例如described here
此图片说明了如何获得所需订单的想法:enter image description 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);
  }
}

请注意,有更好的实现这个想法。