zoukankan      html  css  js  c++  java
  • 如何将某个元素放到集合第一个

    一、情节交待

      现在有一个用户的信息列表,列表中所包含的信息有普通信息、置顶信息、还有标注成"特别关注"的信息,"特别关注"的信息不仅在信息表中存在,还在推荐信息表中存在(说明:"特别关注"不是拿字段做标识,而是关联表记录来区分,因为涉及到有效时间之类的。)。我现在需要把"特别关注"的信息放在信息列表的最前面,但是列表中的信息都是按信息的刷新时间降序排列的,默认是把所有信息都读取出来的,当然也包括"特别关注"的信息。

      我一开始想的就是更改列表的排序规则,先读取"特别关注"的,再读取其他的信息,但是想了一下发现这样做比较麻烦,第一,读取非"特别关注"的信息的时候得筛选掉"特别关注"的信息,第二,这种情况分页实现起来比较麻烦,因为每一页的起始位置都跟"特别关注"信息的条数相关。所以,我考虑换种方式,从List集合本身下手,找了找没找到类似直接移动元素的方法,而且OrderBy()和OrderByDescending()方法不支持按某个属性进行排序(可能是小弟我技术太差,大牛敬请拍砖),考虑到这次的需求,"特别关注"的信息不会太多,也就几条,我就想了一个简单的办法,先删后加法。

    二、先删后加法

      看标题就知道不是什么高深的算法,实现原理就是,获取用户"特别关注"信息的Id集合recommList,循环这个List集合,从用户当前页的信息集合(pageList)中找到"特别关注"的信息,然后用一个临时对象temp接收,从pageList删除这个元素,最后把临时对象temp插入到pageList中的第一个位置。需要注意一点的时,因为信息都是按刷新时间降序排列,所以在获取用户"特别关注"信息的Id集合recommList的时候要按刷新时间升序排列,因为只有按升序排列,执行完先删后加法之后,"特别关注"中最新的信息才会排列在第一个。

    参考代码:

    var pageList = GetPageListByUserId(page,pageSize,userId);//分页获取用户发布的信息集合.
    //处理关注信息,若关注信息太多则这种处理方式不适合.
    var recommList = GetListByUserId(userId);//获取用户的关注信息Id集合,默认是升序,所以经过处理之后最后设置为特别关注的在最前面.
    if (recommList != null && recommList.Count>0)
    {
      //关注信息放在首位,最后标注为"特别关注"的信息应在最前面.
      foreach (var id in recommList)
      {
        var temp = pageList.Find(m => m.InfoId == id);//默认是升序,所以经过处理之后最后标注为"特别关注"的信息在最前面.
        if (temp == null)
        {
          continue;
        }
        pageList.Remove(temp);//先删:直接移除元素.
        temp.IsRecommInfo = true;//这里可以做一些处理,比如设置InfoModel的IsRecommInfo(是否是关注信息)为true.
        pageList.Insert(0, temp);//后加:插入到索引为0的位置即第一个.
      }
    }

    小结:这种处理方式不适合处理大量数据,效率太低.

  • 相关阅读:
    onInterceptTouchEvent 与 onTouchEvent 分析与MotionEvent在ViewGroup与View中的分发
    不用windows不会死
    iframe动态改变内嵌页面高度
    算法5-8:矩形相交
    浅析数据库连接池(二)
    Ubuntu下(Linux+Apache+MYSQL+PHP, LAMP)环境搭建
    unix环境高级编程----进程控制wait()
    centos7 通过kvm+vnc 实现远程桌面虚拟化和创建windows、Linux虚拟机
    Android native层动态库注射
    Windows10 下 JAVA JDK版本设置修改操作
  • 原文地址:https://www.cnblogs.com/52XF/p/4143181.html
Copyright © 2011-2022 走看看