list 集合的排序问题

经常做Java Web开发的朋友有时候会遇到这个问题。需要对你查询出来的数据根据某些字段排序。

目录

一、直接在sql中排序。

二、在Java中排序。


下面说两种解决办法:

一、直接在sql中排序。

优点:方便快速,查询完的时候直接进行order by。数据量小的时候,order by的性能损耗可以忽略。

缺点:不方便扩展,所有的业务都写在sql中。并且只能针对一个sql 进行排序。如果将很多sql拼接到一起,会有性能优化的问题。

实现: mybatis.xml层

ORDER BY
	<choose>
		<when test="sidx !=null and sidx !='' and sord !=null and sord !=''">
            <!-- sidx:排序字段,sord:排序规则(正序还是倒叙) -->
			${sidx} ${sord}
            <!-- 注意这里有一个 空格!!! -->
		</when>
		<otherwise>
			o.cTime ASC
            <!-- 如果排序参数为空,则有一个默认的排序规则 -->
		</otherwise>
	</choose>

二、在Java中排序。

优点:方便程序扩展、处理迅速

缺点:代码量比较大,逻辑较第一种比较复杂(代码简单有效就是一种选择)

实现:

伪造一个 比较复杂的list集合(一通百通),接收类型为:List<Map<String, Object>>

注意,该集合包含一个空数据!!

[
    {
        "userView": ,
        "pageView": 
    },
    {
        "userView": 27,
        "pageView": 50
    },
    {
        "userView": 100,
        "pageView": 138
    },
    {
        "userView": 14,
        "pageView": 28
    }
]

要对这个参数进行排序:JAVA代码如下:

// sidx 排序字段, sord 排序规则。均为String 类型参数 必填!!
if("desc".equals(sord)){
    Collections.sort(goodsNewList, new Comparator<Map<String, Object>>() {
        public int compare(Map<String, Object> o1, Map<String, Object> o2) {
//如果是倒序排列,将空的数据放到最下面
            if (o1.get(sidx) == null || o2.get(sidx) == null) {
                return 1;
            }
//一般而言,进行排序的都是数字类型。解析List<Map<String, Object>> 中的参数方法
            Double sidx1 = Double.valueOf(o1.get(sidx).toString()) ; 
            Double sidx2 = Double.valueOf(o2.get(sidx).toString()) ;
            return sidx2.compareTo(sidx1);
        }
    });
}else if("asc".equals(sord)){
    Collections.sort(goodsNewList, new Comparator<Map<String, Object>>() {
        public int compare(Map<String, Object> o1, Map<String, Object> o2) {
//如果是正序排列,将空的数据放到最上面
            if (o1.get(sidx) == null || o2.get(sidx) == null) {
                return -1;
            }
//一般而言,进行排序的都是数字类型。解析List<Map<String, Object>> 中的参数方法
            Double sidx1 = Double.valueOf(o1.get(sidx).toString()) ; 
            Double sidx2 = Double.valueOf(o2.get(sidx).toString()) ;
            return sidx1.compareTo(sidx2);
        }
    });
}

至此,列表排序的两个方案:sql排序,JAVA排序都已经写完了。由于为了更方便读者理解,代码没有做到最简介,大家理解代码即可。另外,还有例如:redis排序,MQ消息排序等等。我们下次再聊。

如有任何问题,请留言即可。感谢你阅读到这里。

发布了67 篇原创文章 · 获赞 678 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_26465035/article/details/96840371