一个比较麻烦的排序需求,该怎么处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chillingkitten
V2EX    Java

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

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

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

    现在突然要求改顺序,要让搜索的关键词开头的放在前面,比如上面的例子, 期望的效果是:
    "4 号",
    "4 号"
    "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     Solana     1425 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 16:55 PVG 00:55 LAX 09:55 JFK 12:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86