经常做Java Web开发的朋友有时候会遇到这个问题。需要对你查询出来的数据根据某些字段排序。
目录
下面说两种解决办法:
一、直接在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消息排序等等。我们下次再聊。
如有任何问题,请留言即可。感谢你阅读到这里。