代码用C#容易写,你需要的时候自己转成oc或swift 你要两个数据结构: class Comment { public string id; public string message; puglic Comment parent; puglic List<Comment> Children; } 和 Dictionary<string, Comment> comments = {}; 假设说你拿到的已经是按照时间排序好的了,那首先你就可以写一个函数来生成他们的父子结构。这里的ServerComment指的是你从服务器拿到的数据,显然这不可能是一棵树,所以你要声明上面的Comment类,注意区别这两个类型。 struct ServerComment { string id; string parentId; // nullable string message; } void Resolve(ServerComment[] commentsByTime) { foreach(var serverComment in commentsByTime) { var comment = new Comment() { id = serverComment.id, message = serverComment.message }; comments.Add(comment.id, comment); } foreach(var serverComment in commentsByTime) { if(serverComment.parentId != null) { var comment = comments[serverComment.id]; var parent = comments[serverComment.parentId]; if (parent.Children == null) { parent.Children = new List<Comment>(); } comment.parent = parent; parent.Children.Add(comment); } } } 然后你就得到了他们的父子关系了。后面排序就简单了,只需要按照时间顺序找到所有parent==null的记录,然后立刻把他的Children枚举出来就可以了。可以使用递归来做: void PrintTree(Comment comment, List<Comment> sortedComments) { sortedComments.Add(comment); if(comment.Children != null) { foreach(var child in comment.Children) { Sort(child.id, sortedComments) } } } List<Comment> Sort(ServerComment[] commentsByTime) { List<Comment> sortedComments = new List<Comment>(); foreach(var serverComment in commentsByTime) { var comment=comments[serverComment.Id]; if (comment.parent == null) { PrintTree(comment, sortedComments); } } return sortedComments; } 就大功告成了。如果你需要打印出真的树形的表格,那只要改改PrintTree就行了。 ============================================================== 如果题主看不明白的话,下面就是代码的主要内容。 假设你拿到的数据有 (a, null, x) (b, null, y) (c, a, z) (d, a, u) 他们已经排序好了那么最终comments这个map的内容就是 a => (a, null, x, children = [(c, a, z), (d, a, u)]) b => (b, null, y) c => (c, a, z) d => (d, a, u) 注意c跟d是class,所以他们跟a的children里面是同一个对象。 不过这个map是按照id排序的,不是按照时间排序的,所以才会有后面那个函数,重新读一下服务器给你的comment,去找那些parent是null的(在这里就是a和b),最后打印出来: (a, x) (c, z) (d, u) (b, y)
代码用C#容易写,你需要的时候自己转成oc或swift
你要两个数据结构:
和
假设说你拿到的已经是按照时间排序好的了,那首先你就可以写一个函数来生成他们的父子结构。这里的ServerComment指的是你从服务器拿到的数据,显然这不可能是一棵树,所以你要声明上面的Comment类,注意区别这两个类型。
然后你就得到了他们的父子关系了。后面排序就简单了,只需要按照时间顺序找到所有parent==null的记录,然后立刻把他的Children枚举出来就可以了。可以使用递归来做:
就大功告成了。如果你需要打印出真的树形的表格,那只要改改PrintTree就行了。
==============================================================
如果题主看不明白的话,下面就是代码的主要内容。
假设你拿到的数据有
他们已经排序好了
那么最终comments这个map的内容就是
注意c跟d是class,所以他们跟a的children里面是同一个对象。
不过这个map是按照id排序的,不是按照时间排序的,所以才会有后面那个函数,重新读一下服务器给你的comment,去找那些parent是null的(在这里就是a和b),最后打印出来: