如何将某个元素放到集合第一个

一、情节交待

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

  我一开始想的就是更改列表的排序规则,先读取"特别关注"的,再读取其他的信息,但是想了一下发现这样做比较麻烦,第一,读取非"特别关注"的信息的时候得筛选掉"特别关注"的信息,第二,这种情况分页实现起来比较麻烦,因为每一页的起始位置都跟"特别关注"信息的条数相关。所以,我考虑换种方式,从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的位置即第一个.
  }
}

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

时间: 2024-10-29 10:45:48

如何将某个元素放到集合第一个的相关文章

[ jquery 文档处理 insertAfter(content) after(content|fn) ] 此方法用于把所有匹配的元素插入到另一个、指定的元素元素集合的后面,实现外部插入

after(content | fn):在每个匹配的元素之后插入内容 insertAfter(content): 把所有匹配的元素插入到另一个.指定的元素元素集合的后面 实际上,使用这个方法是颠倒了常规的$(A).after(B)的操作,即不是把B插入到A后面,而是把A插入到B后面 在jQuery 1.3.2中,appendTo, prependTo, insertBefore, insertAfter, 和 replaceAll这个几个方法成为一个破坏性操作,要选择先前选中的元素,需要使用en

[ jquery 文档处理 prependTo(content) ] 此方法用于把所有匹配的元素前置到另一个、指定的元素元素集合中

把所有匹配的元素前置到另一个.指定的元素元素集合中 实际上,使用这个方法是颠倒了常规的$(A).prepend(B)的操作,即不是把B前置到A中,而是把A前置到B中 在jQuery 1.3.2中,appendTo, prependTo, insertBefore, insertAfter, 和 replaceAll这个几个方法成为一个破坏性操作,要选择先前选中的元素,需要使用end()方法,参见 appendTo 方法的例二 实例: <html lang='zh-cn'> <head&g

[ jquery 文档处理 appendTo(content) ] 此方法用于把所有匹配的元素追加到另一个指定的元素集合中

把所有匹配的元素追加到另一个指定的元素元素集合中. 实际上,使用这个方法是颠倒了常规的$(A).append(B)的操作,即不是把B追加到A中,而是把A追加到B中. 在jQuery 1.3.2中,appendTo, prependTo, insertBefore, insertAfter, 和 replaceAll这个几个方法成为一个破坏性操作,返回值是所有被追加的内容,而不仅仅是先前所选中的元素.所以,要选择先前选中的元素,需要使用end()方法,参见例二. 实例: <html lang='z

从Move-To-Front encoding的一个常用问题:把一个元素放到最前面

在MTF的encoding中,主要就是把要encode的string和symbol table比较,将对应的index保存并把相同的值放到symbol table的最前头. eg: string = caaabaa... symbol table = 0123abcd... 则要得到:c0123abd... 所以主要问题就是把中间一段和c交换位置. 方法一:2次循环,第一次,在symbol table一个一个比较,找到string这个元素在ST中的ind.第2次,把ST中找到的相同元素一个一个的

元素与集合的问题思考

今天同事遇到一个元素和集合的问题,引发了我的思考.情景如下 一个元素和集合,如果元素在集合内,则移除该集合内的这个元素,否则添加该元素进入这个集合. 他给出代码如下: <?php $value=5; $list=array(1,2,3,4,5,6,7,8,9,10); if(empty($list) || !in_array($value,$list) ) { $list[] = $value; }else { foreach($list as $k => $v) { if($v == $va

Python——集合是一个非常之牛逼的数据比较方式

什么是集合?对似懂非懂或者被集合搞晕了的同学可以来看一下.    首先不想说太多概念性的东西,免得又晕了! 请看下面我写的例子,看完之后自然就知道啥是集合以及如何去应用它 #变量a是一个集合类型 a = set() print(type(a)) #定义一个列表,并存入很多重复的数字 dt = [12,9,2,8,4,9,2,7,4,5,6,11,5,7,5,7,9,8,7,2] for i in dt: #遍历列表     a.add(i) #将列表中的每一个元素添加进集合 #打印集合,发现,自

如何判断一个元素是否存在于一个亿级数据集中?

布隆过滤器的概念布隆过滤器(Bloom Filter)于 1970 年由布隆提出的,是专门 用于检索一个元素是否存在于一个集合中的算法. 你可能会想,判断一个元素是否在集合中,这不就是集合自带的功能吗? 元素数量少的时候的确没问题,但如果有海量元素时就麻烦了,例如千万,甚至上亿个元素,而且每个元素的大小不一,有可能很大,这时集合的空间效率和查询效率都会堪忧. 而布隆过滤器就可以巧妙的解决这个问题,它包括了一个很长的二进制向量和一系列的hash函数,它不会实际存储元素内容,只是在二进制向量中标识这

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素 参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 一个DOM元素 function(index)FunctionV1.4 一个用来检查集合中每个元素的函数.this是当前的元素. 示例 描述: 从p元素中删除带有 select 的ID的元素 HTML 代码: <p>Hello</p><p id="selected&quo

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n