V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chillingkitten
V2EX  ›  Java

一个比较麻烦的排序需求,该怎么处理?

  •  
  •   chillingkitten · 2021-01-20 14:34:37 +08:00 · 2103 次点击
    这是一个创建于 1191 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目有一个关键词搜索功能,数据来源是调三方接口,目前是直接透传返回 list. 排序是按其中一个字段的“数字字母自然顺序”,就是这样的:
    假如关键词搜 "4",可能的返回是
    "24 号",
    "42 号"
    "433 号",
    "4 号"

    注意,这个字段中可能有文字,自然顺序数字是优先于文字的把,所以 ”42 号“要比"4 号"在前

    现在突然要求改顺序,要让搜索的关键词开头的放在前面,比如上面的例子, 期望的效果是:
    "4 号",
    "42 号"
    "433 号",
    "24 号"


    这个咋整啊。 三方接口方明确拒绝为这种定制的需求进行修改,只有自己接收到原始数据后自己 sorting. 但是试了下没头绪。 有什么工具类有这种功能么?
    8 条回复    2021-01-21 12:05:03 +08:00
    jjwjiang
        1
    jjwjiang  
       2021-01-20 14:43:40 +08:00
    自己重载一个比较器,以关键字开头的字符串有最高的权重,剩下调用 string 的比较不就行了吗
    goinghugh
        2
    goinghugh  
       2021-01-20 14:46:05 +08:00   ❤️ 1
    他返回的是全局排序的,如果他不支持,只能你拿到数据后自己排序。但是你一次只拿一页的数据,你做的的话也只能是局部排序,效果可能并不好
    2379920898
        3
    2379920898  
       2021-01-20 14:46:30 +08:00
    思路很简单的,接口返回的数据排序一下就 OK 。。给你个思路 ,搜索的关键字和每条数据比较,写条件。就 OK 了啊。
    crazytudou
        4
    crazytudou  
       2021-01-20 15:45:00 +08:00
    取得 关键字 在字符串里的 index,然后再正常排序,时间复杂度比相互对比的小
    string index
    "24 号", 1
    "42 号" 0
    "433 号", 0
    "4 号" 0
    arthas2234
        5
    arthas2234  
       2021-01-20 15:55:49 +08:00
    无分页自己排
    有分页对结果排序无解,只能从输入数据的时候做分割,数字和“号”之间插入一个比数字更靠前的分隔符
    chillingkitten
        6
    chillingkitten  
    OP
       2021-01-20 18:17:35 +08:00
    @crazytudou 这个思路有考虑过, 不过以上面例子来说,只能把 4 开头的记录放在前面,但是对于 4 开头的记录来说,用自然排序的话还是 42 号 - 433 号 - 4 号这样的吧。 现在想要的效果是 4 号-42 号-433 号 (其实后两个都不那么严格,但是刚好匹配的‘4 号’一定要在最前)
    crazytudou
        7
    crazytudou  
       2021-01-21 08:32:36 +08:00
    @chillingkitten 你是不是写错了,排序要两个列都加进去,order by index, string 这样得出的结果会是
    string index
    4 号 0
    42 号 0
    433 号 0
    24 号 1
    正是你想要的结果没有错。
    milkpuff
        8
    milkpuff  
       2021-01-21 12:05:03 +08:00
    把“号”去掉,排完再加回来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5421 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:04 · PVG 15:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.