ios数组对象排序 就是类似QQ评论和回复 服务器是按照时间排的 我现在要排序回复插到回复的那条评论下面
迷茫
迷茫 2017-04-17 16:54:22
[iOS讨论组]
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
天蓬老师

代码用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) 
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号