ios数组对象排序 就是类似QQ评论和回复 服务器是按照时间排的 我现在要排序回复插到回复的那条评论下面

发布于 2022-09-01 21:40:54 字数 59 浏览 16 评论 0

ios数组对象排序 就是类似QQ评论和回复 服务器是按照时间排的 我现在要排序回复插到回复的那条评论下面

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

混浊又暗下来 2022-09-08 21:40:54

代码用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) 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文