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

2021-01-20 14:34:37 +08:00
 chillingkitten
项目有一个关键词搜索功能,数据来源是调三方接口,目前是直接透传返回 list. 排序是按其中一个字段的“数字字母自然顺序”,就是这样的:
假如关键词搜 "4",可能的返回是
"24 号",
"42 号"
"433 号",
"4 号"

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

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


这个咋整啊。 三方接口方明确拒绝为这种定制的需求进行修改,只有自己接收到原始数据后自己 sorting. 但是试了下没头绪。 有什么工具类有这种功能么?
2270 次点击
所在节点    Java
8 条回复
jjwjiang
2021-01-20 14:43:40 +08:00
自己重载一个比较器,以关键字开头的字符串有最高的权重,剩下调用 string 的比较不就行了吗
goinghugh
2021-01-20 14:46:05 +08:00
他返回的是全局排序的,如果他不支持,只能你拿到数据后自己排序。但是你一次只拿一页的数据,你做的的话也只能是局部排序,效果可能并不好
2379920898
2021-01-20 14:46:30 +08:00
思路很简单的,接口返回的数据排序一下就 OK 。。给你个思路 ,搜索的关键字和每条数据比较,写条件。就 OK 了啊。
crazytudou
2021-01-20 15:45:00 +08:00
取得 关键字 在字符串里的 index,然后再正常排序,时间复杂度比相互对比的小
string index
"24 号", 1
"42 号" 0
"433 号", 0
"4 号" 0
arthas2234
2021-01-20 15:55:49 +08:00
无分页自己排
有分页对结果排序无解,只能从输入数据的时候做分割,数字和“号”之间插入一个比数字更靠前的分隔符
chillingkitten
2021-01-20 18:17:35 +08:00
@crazytudou 这个思路有考虑过, 不过以上面例子来说,只能把 4 开头的记录放在前面,但是对于 4 开头的记录来说,用自然排序的话还是 42 号 - 433 号 - 4 号这样的吧。 现在想要的效果是 4 号-42 号-433 号 (其实后两个都不那么严格,但是刚好匹配的‘4 号’一定要在最前)
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
2021-01-21 12:05:03 +08:00
把“号”去掉,排完再加回来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX