0

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

我需要按以下方式对其进行排序。我尝试了比较器,但它确实变得复杂。我不确定是否必须使用树排序或任何其他算法来解决此问题。谢谢。

必需的

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}
]

如您所见,分层项目都排序到开头(不必在开头),但必须在列表中一起。

4

2 回答 2

1

我有点困惑。你说你希望它与分组的层次结构(parentIds)一起排序。但是您的必需输出将您的“parentId:1”组分成两部分?

如果您希望将父母分组,那么您所需的输出中有一个错误。

- - 更新 - -

好的,所以你不希望你的排序被父母分组,你希望它是深度优先排序。

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);
  }
}

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

于 2014-11-12T21:09:23.507 回答
1

更新
您应该使用深度搜索算法,如这里所述
此图说明了如何获得所需订单的想法:在此处输入图像描述

伪代码中很简单,这里是深度搜索算法的排序版本

_items[] depthSort (_parent){
  add _parent to _items[];

  get _children of _parent sorted by desired attribute;

  for every _item in _children
      depthSort(_item);
}
于 2014-11-12T21:08:59.680 回答