精华内容
下载资源
问答
  • 2021-01-19 01:04:51

    自定义排序之数据库设计

    之前做过的项目有项需求,就是要对一个普通的列表进行自定义排序功能,当初构思了几个方案,各有所长,按需使用,下面就一一来介绍这几个方案。

    注:这里的自定义排序就是操作列表的某项进行位置交换。

    1. 单表单列结构(数组结构)

    此设计是使用一个表中的一列来表示数据的序号,通常我们使用的方法就是这种。

    数据表tb_data(n):

    dataindex

    ···

    0

    ···

    1

    ···

    2

    这里规定序号从0开始递增。

    其基本数据操作如下:

    增 → 当增加一个数据时,定义data的序号为数据总数量值。

    删 → 当删除一个数据时,将大于该序号的数据的序号都减1。

    改 → 当修改位置将数据a从x移动到y时,若x小于y,则将(x,y]范围内的数据序号都减1;若x大于y,则将[y,x)范围内的数据序号都加1(注:修改数据库时,要先将a的序号x修改为未被使用的序号z,然后再修改范围内的数据,最后再将z修改为y,顺序不能乱)。

    查 → 当查找数据时添加 order by index 即可得到自定义排列的数据,查找第n个数据时查找条件为 index=n-1 即可。

    总结:此方法查找速度最快,修改速度最慢。

    2.单表双列结构(链表结构)

    此设计是使用一个表中的两列来表示数据的序号,一列表示该数据的前置id,一列表示该数据的后置序id(id为数据表本身的自增序号),即相当于我们经常使用的双向链表。

    数据表tb_data(n):

    iddatapre_nonext_no

    0

    ···

    -1

    1

    1

    ···

    0

    2

    2

    ···

    1

    3

    3

    ···

    2

    -1

    这里规定第一个数据的pre_no为-1,最后一个数据的next_no为-1。

    其基本数据操作如下:

    增 → 当增加一个数据a时,先查找出最后一个数据b的id号,a的pre_no定义为b的id号(若此数据为第一个则定义为-1),next_no定义为-1,再将b的next_no定义为a的id号。

    删 → 当删除一个数据a时,取出a的pre_no和next_no,将pre_no对应的id的数据的next_no修改为a的next_no,将next_no对应的id的数据的pre_no修改为a的pre_no。

    改 → 令位置x-1、x+1数据分别为b、c,位置y-1、y、y+1的数据分别为d、e、f,现修改位置将数据a从x移动到y时,

    当x小于y时,修改b的next_no为c的id,修改c的pre_no为b的id,修改e的next_no为a的id,修改f的pre_no为a的id,最后修改a的pre_no为e的id,next_no为f的id;

    当x大于y时,修改b的next_no为c的id,修改c的pre_no为b的id,修改d的next_no为a的id,修改e的pre_no为a的id,最后修改a的pre_no为d的id,next_no为e的id。

    查 → 当查找第n个数据时,需要先查找出第一个数据,在根据第一个数据逐个往后查找数据的next_no,查找n次后得到第n个数据。

    总结:此方法查找速度最慢,修改速度最快。

    3.双表双列结构(分页结构)

    此设计是使用一个页码表记录全部页码和页码的序号范围,另一个数据表来记录基本数据、自身序号和页码,通过在一个表中给数据设置不同的序号和页码来达到分页排序的效果。

    页码表tb_page:

    tb_namepagestart_indexend_index

    tb_data0

    0

    1

    1000

    tb_data0

    1

    1

    1000

    tb_data0

    2

    1

    120

    tb_data1

    0

    1

    1000

    tb_data1

    1

    1

    130

    table_name为一个基本数据表的表名,对于每一个table_name,其对应的page都从0开始递增且不能重复,每个page有一定的数据范围(这里设定为一页有1000条数据),则每个数据表对应的数据总量即可计算出来。

    基本数据表tb_data(n):

    datapageindex

    ···

    0

    1

    ···

    0

    ···

    ···

    0

    1000

    ···

    1

    1

    ···

    1

    ···

    ···

    1

    1000

    ···

    2

    1

    ···

    2

    ···

    ···

    2

    120

    data为数据域,记录基本数据,对于每一个不相同的data都有对应的page和index,通过page、index和每一页的数据范围即可计算出对应的全局序号。

    其基本数据操作如下:

    增 → 当增加一个数据时,先从页码表中查找出最后的page及其对应的start_index和end_index,若end_index-start_index+1没有数据超出范围,则插入数据的page不变,index为end_index+1,若超出范围,则需在页码表中新建一页,插入数据的page自加一,index赋值初始值。

    删 → 当删除一个数据时,因为需要保证除末页以外的页码的数据范围都为规定值,所以需要对删除数据对应的页码及以上页码的数据进行调整,对于删除数据的页码,可以通过对比该数据在页码中的相对位置来调整较小数据量的一方数据执行加减1,对于大于其的页码,可以将每一页的首数据调整为上一页的末数据(末页数量为0即可将末页删除)。

    改 → 当修改位置将数据a从x移动到y,计算x、y对应的页码,当x、y的页码相同时,只需调整该页数据,可通过对比x到y的数量和页码数量来决定调整x、y范围内还是范围外的数据信息;当x、y页码不同时,可通过对x、y在页码中的相对位置来调整较小数据量的一方数据执行加减1,若x小于y,(x,y]范围内的页的首数据调整为上一页的末数据,若x大于y,[y,x)范围内的页的末数据调整为下一页的首数据。

    查 → 当查找数据总量时,可以通过查找页码表计算得出;当查找序号为n的数据时,可以通过页码表计算得到对应的page和index,然后再通过查找数据表取得数据(由于页码表的数据会经常使用,所以最好从数据库取出一次后保存在内存中再进行使用即可提高速度)。

    总结:此方法查找速度和修改速度比较均衡,适合大多数情况使用。

    更多相关内容
  • JAVA实现自定义排序

    2021-12-16 11:22:28
    JAVA collections.sort中文自定义排序

    一、需求:

    最近接到一个需求,要求对成绩单的成绩进行排序。不是按照成绩排序,而是按照课程类别和上课的时间进行排序。我首先想到的是双循环,但是我认为这样的话if-else要写到猴年马月。

    之后我开始回忆以前的数据结构了,不论是二分法还是快排,他们分明比较的都是数字大小啊,字符串虽然可以比较,但是现在课程的排序是人为自定义的,我怎么比较呢?

    二、问题:

    根据现在遇到的情况我就认为,想要排序必然要把字符串转换成数字,毕竟排序都是数字的,那么只有这样才能够直接比较。因此很自然的需要创建一个HashMap存放课程类别和它对应的大小。

    成绩单长这样。
    在这里插入图片描述

    三、业务介绍

    我这里的课程类别是一个对象,因为课程类别里面有一级学科二级学科这样,不过这是业务知识不重要,因此直接开始讲我的解决方案。在实际业务当中,数据还有老成绩和新成绩的说法,所以判断的地方非常多,有一点点小复杂。

    四、代码

    使用的是Collections下的sort方法,传入你需要排序的List以及排序方法。

    //自定义排序1
    Collections.sort(list, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.getId() - o2.getId();
        }
    });
    

    前面提到过,既然是自定义排序,那么一定要对排序的东西事先定义好排序大小。

    //为给课程排序,自定义排序规则,key是course_category的id,value是排名
        private static Map<Long,Integer> zsCourseSortMap = new HashMap<>();//专硕
        private static Map<Long,Integer> xsCourseSortMap = new HashMap<>();//学硕
        static {
            xsCourseSortMap.put(1249L,0);//学位公共课(必修)
            xsCourseSortMap.put(18L,1);//学位基础课(必修)
            xsCourseSortMap.put(19L,2);//学位专业课(必修)
            xsCourseSortMap.put(20L,3);//学位专业课(选修)
            xsCourseSortMap.put(21L,4);//跨学科或跨专业课程(选修)
            xsCourseSortMap.put(23L,5);//公共选修课
            xsCourseSortMap.put(-1L,100);//其它
    
            zsCourseSortMap.put(1254L,0);//公共课 必修
            zsCourseSortMap.put(1265L,0);//公共课 通识
            zsCourseSortMap.put(18L,1);//学位基础课
            zsCourseSortMap.put(670L,2);//专业必修课
            zsCourseSortMap.put(671L,3);//专业选修课
            zsCourseSortMap.put(672L,4);//专业实践
            zsCourseSortMap.put(-1L,100);//
        }
    

    解释一下,这里的Key是课程类别对象的id,value是我自定义的大小,到时候只需要判断类别的id就能判断是哪一门课类别,之所以不直接存对象是我觉得这里new对象是一件很麻烦的事情,如果还要从数据库中一个个找出来存好,或许增加了不必要的开销。使用static是因为这些资源是亘古不变的,不随对象的变化而变化。


    这里介绍一下传入的成绩列表。传进去的每一个成绩实际上是一个Map而不是Score对象。因为业务上表要达到范式要求,表的属性不能要啥都有啥,很多时候是精简的,Score本身可能并不存课程类别之类的。因此实际上获取的数据是已经封装好的Map格式

    List<Map<String, Object>> scoreList;
    
    private void sortScoreListByCategory(List<Map<String,Object>> scoreList, Map<Long,Integer> degreeTypeMap) {
            Collections.sort(scoreList, new Comparator<Map<String, Object>>() {
                @Override
                public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                    CourseCategory o1Category = new CourseCategory();
                    CourseCategory o2Category = new CourseCategory();
                    if( o1.get("courseCategory") instanceof CourseCategory) { //能否转型
                        o1Category = (CourseCategory) o1.get("courseCategory");
                    } else {
                        Map map1 =(Map) o1.get("courseCategory");
                        o1Category = courseCategoryRepository.findByFirstCategoryAndSecondCategory(map1.get("firstCategory").toString(), map1.get("secondCategory").toString());
                    }
                    if( o2.get("courseCategory") instanceof CourseCategory) {
                        o2Category = (CourseCategory) o2.get("courseCategory");
                    } else {
                        Map map2 =(Map) o2.get("courseCategory");
                        o2Category = courseCategoryRepository.findByFirstCategoryAndSecondCategory(map2.get("firstCategory").toString(), map2.get("secondCategory").toString());
                    }
    
                    String o1studyTime = (String) o1.get("studyTime");
                    String o2studyTime = (String) o2.get("studyTime");
                    if(o1Category.getId() != o2Category.getId()) { //判断课程类别ID是否相等
                        return degreeTypeMap.get(o1Category.getId()) == null ? degreeTypeMap.get(-1L) : degreeTypeMap.get(o1Category.getId()).compareTo(degreeTypeMap.get(o2Category.getId()) == null ? degreeTypeMap.get(-1L) : degreeTypeMap.get(o2Category.getId()));
                    } else if (!o1studyTime.equals(o2studyTime)){
                        return o1studyTime.compareTo(o2studyTime);
                    }
                    return 0;
                }
            });
        }
    

    五、代码解释
    根据最上面的格式,sort传进去一个List和comparator。degreeTypeMap是最前面第二个自定义的Map排序规则,要用到。

    compare里面其实就是传进去两个List里存放的两个随意对象。因为本质是两两比较。
    严谨点需要先判断,Map里取出的courseCategory(课程类别)能不能转型成课程类别,如果不能则说明是老数据(业务问题),从数据库中找出这个课程类别对象。那么至此就获取了需要比较的这两个对象的课程类别。

    核心: 关键就是下面的如果课程类别的id不相等则说明要比较,然后从自定义的Map中获取这门课程类别的排序值,但是这里需要多一个判断,因为自定义排序可能有其他的类型,如果没有找到这门课的课程类别说明是其它,按照其它处理。
    获取两门课的排序值以后,直接对他门进行.compareTo就行了当然相减也可以。

    如果课程类别的id一样则再判断他们课程的学年就行了,这里因为学年是时间字符串,可以直接比较。

    升序降序

    @Override
        public int compareTo(Student o1, Student o2) {
            //降序
            //return o1.compareTo(o2);
            //升序
            return o2.compareTo(o1);        
        }
    

    根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数

    降序就是由下往上是从大到小。

    暂时先这样写

    展开全文
  • 搜索时使用了其他字段作为排序条件,ES 默认是使用_score 作为排序条件的 二、解决 在 sort里增加 _score字段排序 GET goods/_search { "from": 0, "size": 20, "query": { "bool": { "must": [ { "term": { ...

    请参考:总结——》【Elasticsearch】
    系统SystemLinux
    版本versionelasticesearch7.6
    根目录rootPath/opt/app/elasticesearch7.6
    在这里插入图片描述

    一、默认排序

    默认情况下,是按照_score降序排序的

    GET goods/_search
    {
      "from": 0,
      "size": 20,
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "status": {
                  "value": 1,
                  "boost": 1
                }
              }
            }
          ]
        }
      }
    }
    

    在这里插入图片描述

    二、自定义排序

    sort参数里,指定字段作为排序条件

    GET goods/_search
    {
      "from": 0,
      "size": 20,
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "status": {
                  "value": 1,
                  "boost": 1
                }
              }
            }
          ]
        }
      },
      "sort": [
        {
          "putSaleTime": {
            "order": "desc"
          }
        }
      ]
    }
    
    

    在这里插入图片描述

    1、现象

    sort参数里,指定字段作为排序条件,搜索结果中_score字段为null

    2、解决

    sort参数里增加 _score字段排序

    GET goods/_search
    {
      "from": 0,
      "size": 20,
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "status": {
                  "value": 1,
                  "boost": 1
                }
              }
            }
          ]
        }
      },
      "sort": [
        {
          "putSaleTime": {
            "order": "desc"
          }
        },
        {
          "_score":{
            "order": "desc"
          }
        }
      ]
    }
    
    

    在这里插入图片描述

    展开全文
  • ES 加权重自定义排序

    千次阅读 2022-04-14 14:59:56
    es搜索keyWord字段,需要给es指定字段weight加上系数进行排序 二、建立测试索引 curl -XDELETE 'http://flxapp01:9200/local_service' curl -X PUT '192.168.1.96:9200/local_service?pretty' \ -H 'Accept: ...

    一、需求
    es搜索keyWord字段,需要给es指定字段weight加上权重进行排序
    es版本:elasticsearch 6.5.0
    二、建立测试索引

     curl -XDELETE 'http://flxapp01:9200/local_service'
    curl -X PUT '192.168.1.96:9200/local_service?pretty' \
    -H 'Accept: application/json,text/plain, */*' \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -d '{
     "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 2
     },
     "mappings": {
      "local_basic":{
       "properties": {
        "keyWord": {"type": "text"},
        "weight": {"type": "long"},
        "gmtCreate": {"type": "long"},
        "gmtModified": {"type": "text"},
        "type": {"type": "text"}
       }
     }
     }
    }'
    
    

    二、加入测试数据

    curl -X POST '192.168.1.59:9200/local_service/local_basic/1' \
    -H 'Accept: application/json,text/plain, */*' \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -d '
    {
        "keyWord":"c",
        "weight":1,
        "gmtCreate":10011,
        "gmtModified":"liyingjiea",
         "type":"es"
        }'
    

    三、排序代码
    利用painless脚本,利用doc找到对应的索引字段值加上权重,doc[‘weigth’]

    curl -XGET 'http://192.168.1.59:9200/es_local_service/_search/?pretty' \
    -H 'Accept: application/json,text/plain, */*' \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -d '{
    "query": {
            "match_phrase": {
                "keyWord": "c"
            }
        },
        "sort":[ {
               "_script":{
               "type": "number",
                "script": {
                    "source": "def s=0.0;s =  doc['\''weight'\''].value+params.score_percent;return s;",
                    "params": {
                        "score_percent": 0.7, 
                        "course_percent": 0.3
                    }
            },
            "order": "asc"
         }
      }
      ]
    }'
    

    四、问题
    在利用linux 的curl 测试过程中出现如下错误

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "script_exception",
            "reason" : "compile error",
            "script_stack" : [
              "def s=0.0;s =  doc[weight].value+params.scor ...",
              "                   ^---- HERE"
            ],
            "script" : "def s=0.0;s =  doc[weight].value+params.score_percent;return s;",
            "lang" : "painless"
          }
        ],
        "type" : "search_phase_execution_exception",
        "reason" : "all shards failed",
        "phase" : "query",
        "grouped" : true,
        "failed_shards" : [
          {
            "shard" : 0,
            "index" : "local_service",
            "node" : "sFvc-I-CRSqUw1qlGFiLrA",
            "reason" : {
              "type" : "script_exception",
              "reason" : "compile error",
              "script_stack" : [
                "def s=0.0;s =  doc[weight].value+params.scor ...",
                "                   ^---- HERE"
              ],
              "script" : "def s=0.0;s =  doc[weight].value+params.score_percent;return s;",
              "lang" : "painless",
              "caused_by" : {
                "type" : "illegal_argument_exception",
                "reason" : "Variable [weight] is not defined."
              }
            }
          }
        ]
      },
      "status" : 500
    }
    

    在请求参数中,用的是doc[‘weight’] ,没用对单引号进行转义

    展开全文
  • 一、map自定义排序 哪个字段需要排序,将其设为map输出的key,利用map的排序完成。 如果字段为基本类型且正序排序,则直接设为key,利用map默认排序即可。 如果字段为对象或需要倒序排序,则需利用对象类实现...
  • 自定义序列排序数据

    千次阅读 2021-01-26 13:09:38
    时 间:2015-11-30 13:33:29作 者:摘 要:通过编写SQL语句排序数据:where语句,union查询正 文:要使用自定义的序列排序,首先需要使用where语句将符合条件的记录选取出来,语法格式:Select * from Q_员工工资 ...
  • Excel自定义序列方法进行排序技巧

    千次阅读 2020-04-05 10:40:53
    Excel在对表格数据进行排序时,如果列的内容是文本时,默认是按照文本的拼音顺序进行先后排列...第二步:在排序对话框下的“主要关键字”选择示例表格“职务”标题,在次序下选择“自定义序列”如下图。 第三步:...
  • Mybatis自定义SQL动态排序的实现

    千次阅读 2020-10-28 17:54:49
    根据查询列表,条件中可以自定义排序字段和acs desc 2、实现 queryParam public class XxxQueryCondition extends BaseQueryParam { private String name; private Integer status; private Integer level; } /**...
  • 问题描述:手动实现自定义筛选后,点击下拉框会触发排序
  • 这周遇到了一个新的需求,为我们的用户在可用状态之外,再增加一个状态,叫做停用。然后用户列表页的排序按照先按照可用,后停用。在这两个排序中,再按照时间顺序倒叙。 对于增加一个状态而言,我们需要在对应的...
  • 之前总结了 QTableView 实现排序,但是这里还有个问题,就是 Qt 默认的排序状态只有升序和降序,没法通过点击表头恢复到默认的顺序,他这个 SortOrder 宏也只有升序降序两个枚举值(有点奇怪,Qt 很多枚举都有 None ...
  • layui的表格组件目前只支持单列排序,在实际应用中并不能很好的支撑我们的业务需求。今天一时手痒,决定改造一番以支持多重排序。实现思路也比较简单,只需要用一个数组来存放所有排序的列,再把这个数组传到后端...
  • 1.3.0版本 增加table头自定义显示和排序功能 可以通过复选框选中来处理显示与否 ,通过拖拽来控制列的展示顺序 设置 show-fliter为true 增加uuid进行本地缓存 在用element table时候每次写页面都会重复写很多column...
  • 该源码由源码天堂免费提供下载,源码实现了可以方便的增加、删除、移动列表行,这些操作都有动画效果。并且很方便地在列表中添加各种元素:界面标签、界面文本域、界面图片视图等等控件,并且能够对列表中的文字进行...
  • 给表增加排序功能

    2021-04-18 12:41:51
    # :-: 给表增加排序功能> 1. 在vxe-table列中添加拖拽按钮![](https://img.kancloud.cn/f2/1b/f21ba8dbfc0ff2af1c5637ee3a15f5c0_940x158.png)> 2. 引用相应的文件![]...
  • ordering: false, // 禁用排序 searching: false, // 禁用dataTables自带的查询框 processing: true, //加载数据时显示正在加载信息 destroy: true, //刷新dataTables ajax: { url : url, type : 'post', ...
  • 让 Redis zset 支持多条件排序

    万次阅读 2019-11-01 23:31:29
    Redis 的 zset 可以很方便的实现一个排行榜,但是只通过单纯的 score 和 key 排序并不满足一些需要多条件排序的需求。本文将会介绍一些通过计算让 zset 的 score 支持多条件排序的方法。...
  • data数据里,我们想要按照我们自己需要的顺序进行排序,可以增加一个num排序字段,num的数字用来控制你想要的数据顺序 $.each(data,function(i,c){ if(c.name=="a"){ c.num=1 }else if(c.name=="b"){ c.num=...
  • 诸君好,前前期我们聊了VBA编程和数据的常规排序……VBA常用小代码105:Rang对象的排序操作……今天我们再聊下自定义排序……何谓自定义排序,就是按指定的顺序对数据源进行排序呗……今一共分享了三种方法。...
  • Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,而且还支持对数据建立索引,分页查询、多条件查询和排序功能这都不是问题。 不光香,还能造!能够减轻数据库的压力,提高系统性能. ...
  • mysql 等 null 空值排序

    2021-01-19 05:02:01
    【mysql】: MySQL同sqlserver,null默认最小,解决办法同sqlserver 注意: 1、null的列作为查询条件时,无论使用>/=/都是不符合条件的,只能使用isNull来判断。如下: id为4的age字段为空, 执行SQL:select * ...
  • 需求先说一下需求:实现用户自定义的查询,用户可以自定义要查询的列、自定义条件条件自定义排序。除了查询使用外,还可以使用于各个需要根据条件进行约束的业务,如权限;本设计和实现,很大部分是通过数据库和...
  • 关于C++内置排序函数sort的自定义比较器cmp用法 1.基础知识 C++的内置排序函数sort是一个很方便且常用的函数,默认升序排序 其头文件为#include 用法网上有很多,举个简单的例子: #include <iostream> #...
  • 集成了多种条件筛选(也可自定义添加)、排序、上拉加载下拉刷新等,样式颜色、图片、字体都可自定义 使用 Step1:添加依赖 Gradle allprojects { repositories { ... maven { url 'https://www.jitpa...
  • MybatisPlus多表条件排序查询

    千次阅读 2020-04-30 10:26:05
    } /** 为查询增加排序条件(无默认排序条件) * @param wrapper 查询对象 * @param orderField 指定的排序字段,可为空 * @param orderType 指定的排序方向,可为空 * @return 查询对象 */ public static Query...
  • MyBatisPlus分页的同时指定排序规则

    千次阅读 2020-07-29 15:17:47
    //返回分布拦截器 } } 指定排序规则: 方法一 public PageBean<Category> listPage(int pageNum, int pageSize) { IPage<Category> page = new Page(pageNum,pageSize); QueryWrapper<Category> queryWrapper = new...
  •  while (j >= 0 && temp1.CompareTo(list[j]) )//边界限制和插入判断条件   {  list[j + 1] = list[j];//若不是合适位置,有序组元素向后移动   j--;  }  list[j + 1] = temp1;//找到合适的位置,将元素插入...
  • 自定义综合查询实现

    2021-06-17 09:37:57
    之前为直接数据库查询导出,现需要做前端可视化界面,让用户可以自定义筛选条件进行数据查询。 例如:用户筛选年龄数据 有时候需要查18岁以上的,或者18岁以下的,或者一个区间内的,所以常规的传参查询可能需要多个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,164
精华内容 34,065
关键字:

如何增加自定义排序条件