精华内容
下载资源
问答
  • 一、需求背景万恶的产品经理,在不同场景有不同的排序需求,有时候根据字段 0 1 2 升序 ,有时候又是1 2 0 这样排序,重点是还要分页,就无法使用代码去实现排序,只能用纯sql语句。假设现在有一个订单表,表里有个...

    一、需求背景

    万恶的产品经理,在不同场景有不同的排序需求,有时候根据字段 0 1 2 升序 ,有时候又是1 2 0 这样排序,重点是还要分页,就无法使用代码去实现排序,只能用纯sql语句。

    假设现在有一个订单表,表里有个字段为pay_status,0为未支付,1为已支付,2为支付失败

    如果按照 支付失败->已支付->未支付(2,1,0)排序,使用以下sql语句即可

    select * from table_order order by pay_status desc

    但是想按照 已支付->支付失败->未支付(1,2,0)排序,就不能简单地根据这个字段使用desc或者asc了。

    二、FIELD()函数

    FIELD(str,str1,str2,str3,...)

    返回str 在str1, str2, str3, ...列表其中的索引(位置从1开始)。如果str没有找到,返回0。

    SQL> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');

    +---------------------------------------------------------+

    | FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo') |

    +---------------------------------------------------------+

    | 2 |

    +---------------------------------------------------------+

    1 row in set (0.00 sec)

    解决思路:使用原值进行对比,生成一个新的值,再根据此值排序

    select * from table_order order by FIELD(pay_status,1,2,0) asc

    三、IF()函数

    IF(expr1,expr2,expr3)

    sva=1;

    IF(sva=1,"男","女");

    解决思路:先判断某个值是否为目标值,先进xing第一遍排序,然后再对剩余值排序

    select * from table_order order by IF(pay_status=1,1,0) asc,pay_status desc

    展开全文
  • 你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看...

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去。

    在java 8 之前,实现对象Collection排序,集合中被排序和比较大小的对象得实现Comparable接口。在java 8之后,有了Comparator比较器的概念,使用Comparator完成对象数组的排序更加方便快捷,下面就给大家简单的介绍一下java 8中使用Comparator排序的方法。

    一、字符串List排序

    3ed2a29b388bf5874bb8d5197478c7a1.png

    cities是一个字符串数组。注意london的首字母是小写的。

    当使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小写不敏感)的规则排序,结果是:[london, Milan, New Delhi, San Francisco, Tokyo]

    如果使用Comparator.naturalOrder()字母自然顺序排序,结果是:[Milan, New Delhi, San Francisco, Tokyo, london]

    在java 7我们是使用Collections.sort()接受一个数组参数,对数组进行排序。在java 8之后可以直接调用集合类的sort()方法进行排序。sort()方法可以传入一个字符串的排序规则,如:String.CASE_INSENSITIVE_ORDER,也可以传入一个排序器Comparator.naturalOrder()作为参数。

    二、整数类型List排序

    20zr4iiys1p.jpg

    按数字的自然顺序排序,结果是[1, 2, 4, 6, 9]

    三、按对象字段对对象List排序

    这个功能就比较有意思了,举个例子大家理解一下。假设我们有一个类Movie,有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。

    1ndswuuhw3k.jpg

    首先,我们创建了四个Movie对象,然后将它们转换为List

    然后重点的的代码:使用了函数应用Movie::getTitle作为对象的排序字段,即按照电影的title作为排序字段

    然后调用List的forEach方法将List排序结果打印出来,如下(当然我们重写了toString方法,不然打印结果没有意义):

    qrr1vfsy1mb.jpg

    如果我们希望List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。

    四、使用自定义Comparator排序

    我们自定义一个排序器,实现compare函数。返回0表示元素相等,-1表示前一个元素小于后一个元素,1表示前一个元素大于后一个元素。这个规则似乎和java 8之前没什么区别。

    4i4l2ppvsew.jpg

    最终的打印结果如下,按照started的自定义规则进行排序。

    if1k5cu43ih.jpg

    这段代码如果以lambda表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:

    3fd4f290678d648f026129ecb72cb4e2.png

    五、通过Comparator链对对象List排序

    xus51ckkeao.jpg

    上面这段代码先是按是否收藏的倒序排序,再按照电影的评分大小的倒序排序,排序结果如下:

    lbih2rfynh5.jpg

    以上就是JAVA像SQL一样对List对象集合进行排序的详细内容,更多关于JAVA 对list集合排序的资料请关注聚米学院其它相关文章!

    展开全文
  • 你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看...

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去。

    在java 8 之前,实现对象Collection排序,集合中被排序和比较大小的对象得实现Comparable接口。在java 8之后,有了Comparator比较器的概念,使用Comparator完成对象数组的排序更加方便快捷,下面就给大家简单的介绍一下java 8中使用Comparator排序的方法。

    一、字符串List排序

    33d2efc384fde1084b1f3c7efdfff69c.png

    cities是一个字符串数组。注意london的首字母是小写的。

    当使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小写不敏感)的规则排序,结果是:[london, Milan, New Delhi, San Francisco, Tokyo]

    如果使用Comparator.naturalOrder()字母自然顺序排序,结果是:[Milan, New Delhi, San Francisco, Tokyo, london]

    在java 7我们是使用Collections.sort()接受一个数组参数,对数组进行排序。在java 8之后可以直接调用集合类的sort()方法进行排序。sort()方法可以传入一个字符串的排序规则,如:String.CASE_INSENSITIVE_ORDER,也可以传入一个排序器Comparator.naturalOrder()作为参数。

    二、整数类型List排序

    dbcc924f17639ec87919030a37378d52.png

    按数字的自然顺序排序,结果是[1, 2, 4, 6, 9]

    三、按对象字段对对象List排序

    这个功能就比较有意思了,举个例子大家理解一下。假设我们有一个类Movie,有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。

    79c35cbf06add50c0aee78d5c14ced2b.png

    首先,我们创建了四个Movie对象,然后将它们转换为List

    然后重点的的代码:使用了函数应用Movie::getTitle作为对象的排序字段,即按照电影的title作为排序字段

    然后调用List的forEach方法将List排序结果打印出来,如下(当然我们重写了toString方法,不然打印结果没有意义):

    3e3353f5f8a71e08c9d79dec198b6db5.png

    如果我们希望List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。

    四、使用自定义Comparator排序

    我们自定义一个排序器,实现compare函数。返回0表示元素相等,-1表示前一个元素小于后一个元素,1表示前一个元素大于后一个元素。这个规则似乎和java 8之前没什么区别。

    6f89949c6abcf8ee8e44475dbd4cceaf.png

    最终的打印结果如下,按照started的自定义规则进行排序。

    1dccd11942ade24eea5e5e196926881f.png

    这段代码如果以lambda表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:

    1fc3e35bb87773391c4914a8c2624936.png

    五、通过Comparator链对对象List排序

    27faffd27346e4bc468a1845e9b1f2c5.png

    上面这段代码先是按是否收藏的倒序排序,再按照电影的评分大小的倒序排序,排序结果如下:

    4d2a4df645aba0be4fb2430f40d92dd2.png

    以上就是JAVA像SQL一样对List对象集合进行排序的详细内容,更多关于JAVA 对list集合排序的资料请关注脚本之家其它相关文章!

    展开全文
  • 最近遇到了一个问题,那就是数据直接通过sql计算会很慢,或者是计算不出来,那么计算数据的任务只能交给java后台。计算完数据之后,需要对数据进行排序,分页。如果知道固定的排序规则好办,但是如果不知道规则,...

    最近遇到了一个问题,那就是数据直接通过sql计算会很慢,或者是计算不出来,那么计算数据的任务只能交给java后台。

    计算完数据之后,需要对数据进行排序,分页。

    如果知道固定的排序规则好办,但是如果不知道规则,或者规则过多,就需要考虑通用性

    而下面就是我的排序方案:

    总体思路是:

    判断是否为空

    通过第0个元素的数据获取field的列表,考虑到了可能存在通过数据的某一属性的某一属性进行排序的可能

    生成Map>的数据,使用list考虑到了可能存在并列数据的可能,另外被排序的数据需要实现Comparable接口,并且泛型值要写上

    lambda对数据进行排序

    对最终数据进行处理

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import org.springframework.util.ObjectUtils;

    import java.lang.reflect.Field;

    import java.util.*;

    import java.util.stream.Collectors;

    public class A {

    private static final Logger logger = LoggerFactory.getLogger(A.class);

    /**

    * 排序

    *

    * @param dataList

    * @param fieldNameList

    * @param isAsc

    * @param

    * @param

    * @return

    */

    public static > List sort (List dataList, List fieldNameList, boolean isAsc) {

    List fieldList = new ArrayList<>();

    if (ObjectUtils.isEmpty(dataList)) {

    return dataList;

    }

    Class> dataClass = dataList.get(0).getClass();

    for (String name : fieldNameList) { // 循环获取field列表

    Field field = getField(dataClass, name);

    fieldList.add(field);

    dataClass = field.getType();

    }

    Map> dataMap = new HashMap(); // 有多条数据同一值的可能

    dataList.forEach(data -> { // 获取数据Map,

    C key = (C) getData(data, fieldList);

    if (dataMap.containsKey(key)) {

    dataMap.get(key).add(data);

    } else {

    dataMap.put(key, new ArrayList() {{

    add(data);

    }});

    }

    });

    List> tempList;

    if (isAsc) { // 升序

    tempList = dataMap.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.nullsFirst(Comparator.naturalOrder())))

    .map(Map.Entry::getValue).collect(Collectors.toList());

    } else { // 降序

    tempList = dataMap.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.nullsFirst(Comparator.reverseOrder())))

    .map(Map.Entry::getValue).collect(Collectors.toList());

    }

    List resultList = new ArrayList();

    tempList.forEach(data -> {

    data.forEach(d -> {

    resultList.add(d);

    });

    });

    return resultList;

    }

    /**

    * 根据field列表,获取数据

    * @param source

    * @param fieldList

    * @return

    */

    public static Object getData (Object source, List fieldList) {

    try {

    Object obj = fieldList.get(0).get(source);

    if (fieldList.size() == 1) {

    return obj;

    }

    return getDataRecursion(obj, fieldList.subList(1, fieldList.size())); // 多条数据,递归查询

    } catch (IllegalAccessException e) {

    logger.error("", e);

    }

    return source;

    }

    /**

    * 递归获取属性列表

    * @param source

    * @param fieldList

    * @return

    */

    public static Object getDataRecursion (Object source, List fieldList) {

    for (Field field : fieldList) {

    try {

    source = field.get(source);

    } catch (IllegalAccessException e) {

    logger.error("", e);

    }

    }

    return source;

    }

    /**

    * 根据name,获取class的Field

    * @param dataClass

    * @param fieldName

    * @return

    */

    public static Field getField (Class dataClass, String fieldName) {

    Field field = getEntityFieldByFieldName(dataClass, fieldName);

    return field;

    }

    /**

    * 根据属性名,获取对象field,field可获取数据

    */

    public static Field getEntityFieldByFieldName (Class clazz, String fieldName) {

    try {

    // 寻找泛型Field

    Field targetField = null;

    for (; clazz != null; clazz = clazz.getSuperclass()) {

    Field[] fields = clazz.getDeclaredFields();

    try {

    targetField = clazz.getDeclaredField(fieldName);

    break;

    } catch (Exception e) {

    continue;

    }

    }

    targetField.setAccessible(true);

    return targetField;

    } catch (Exception e) { // 这个异常基本不可能发生,若发生就是因为程序出现了bug,那就让你空指针吧

    logger.error("", e);

    return null;

    }

    }

    }

    展开全文
  • SQLJava代码,分别实现分组排序 1、需求说明2、SQL 脚本实现3、Java 代码实现   1、需求说明   需求:        同一个用户可以在多个加油站加油,有个表会记录会员...
  • 你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看...
  • java实现各种排序算法

    2012-05-08 09:16:16
    [Java]代码 view sourceprint? 001 /** 002 * 003 */ 004 package sortAlgorithm; 005 ...006 import java.io.File;...007 import java.io.IOException;...008 import java.sql.Tim...
  • 你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看...
  • 主要介绍了JAVASQL一样对List对象集合进行排序实现方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • 在项目中有时候难免会遇...展示这个列表的时候是在SQL语句中根据sortNum进行排序,正序或者倒序,思路就是点↑的时候把上下的排序码互换位置,点击↓的原理也是如此 如果仅仅是想实现这样最简单的上下排序那么非常的...
  • 中文字符串排序肯定要用到中文排序的Comparator,幸运的是,java有提供这样的Comparator。获取方法:Collator.getInstance(java.util.Locale.CHINA);下面是,自己封装的一个...import java.sql.Date;import java....
  • Java中List排序简单实现在实际项目中可能会遇到不相关的表查询结果拼装成一个并按时间倒序排序,然而这样的需求往往用sql不能方便的实现,就需要分别查询出来用List返回,但是返回时需要排序。这时就需要用到List的...
  • java实现sql的select函数功能2007-6-9文字大小:大中小在Java实现sql的select函数功能――通过简单的机制实现对象数组或集合的选择,过滤,和排序David RapPOPOrt摘要在“filter collections”中,David ...
  • java实现sql的select函数功能2007-6-9文字大小:大中小在Java实现sql的select函数功能――通过简单的机制实现对象数组或集合的选择,过滤,和排序David RapPOPOrt摘要在“filter collections”中,David ...
  • 中文字符串排序肯定要用到中文排序的Comparator,幸运的是,java有提供这样的Comparator。获取方法:Collator.getInstance(java.util.Locale.CHINA);下面是,自己封装的一个...import java.sql.Date;import java....
  • ES 分组排序java实现

    千次阅读 2019-05-10 09:56:23
    实现sql:select field1, field2, sum(field3) from table_name group by field1, field2; 多字段分组并求和;实现sql:select field1, field2, top(field3) from table_name group by field1, field2; ES java 样例...
  • 使用Java提供的 Collator 类来进行中文字符串的...优点:排序方法实现简单. 缺点:排序结果不是很准确. 例子: String[] titles = {"关羽","张飞","公孙瓒","诸葛亮","曹操","刘备","赵云","微微", "哈哈", "哈"...
  • 代码如下: package ... import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
  • 1.10.1.2),需求中可能还要对节点字段进行升序,或者倒序的排序,这样的话SQL中现成的排序是做不到的,当然可以自己写函数实现,也可以在Java代码中自定义排序方法,我这里建议在我们表字段添加一个节点排序字段(将...
  • 实现sql:select field1, field2, sum(field3) from table_name group by field1, field2;多字段分组并求和;实现sql:select field1, field2, top(field3) from table_name group by field1, field2;ES java 样例:/*...
  • java实现按拼音排序

    2018-12-24 11:17:00
    List<WaPayFileVO> list =(List<...) dao.execQueryBeanList(pagesql, params.toArray(), new BeanListProcessor(WaPayFileVO.class)); if("asc".equals(page.getOrder()) && "...
  • 你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看...
  • 上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的相关知识,今天跟大家分享在 各种排序算法的分析及java实现(一)的知识。参考来源:https://www.cnblogs.com/liuling/p/2013-7-24-01.html新的一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 567
精华内容 226
关键字:

java实现sql排序

java 订阅