大佬们,遇到个有意思的问题,看看有解吗

2019-04-26 16:44:26 +08:00
 rizon

表里存储的数据如下

name | order
-----|------
A | 1
B | 2
C | 3

然后比如我要改变 C 的顺序,放到 A 和 B 之间,那么最直接的方式是修改为

name | order
------|------
A | 1
B | 3
C | 2

但是有没有办法可以做到,尽量只修改 C 的 order 值就可以来改变顺序呢?
也就是说有没有一种可以表达顺序的方式,能够做的只修改自身的值就可以改变顺序

为了表达更清晰我举个例子,比如这样
name | order
------|------
A | 1
B | 2
C | 1.5

但是这种对半除的方式,会导致无限小数的问题,不够严谨,感觉也不太合适。
ps. v2 的 markdown 不支持表格唉

3178 次点击
所在节点    程序员
26 条回复
Vegetable
2019-04-26 17:00:20 +08:00
设置优先级.优先级不严格与顺序对应.
A 1
B 2
C 3

把 C 改成 1.1,自然就排在 AB 之间了.
我们业务上某些展示页面的排序就是这么做的.有好处也有坏处.我个人是参考了 scrapy 的中间件优先级设置.
geelaw
2019-04-26 17:03:24 +08:00
在有限的 domain 上不存在,在稠密的 domain 上可以(例如用字典序排序的不限长字符串)。

如果你不需要快速的排序,你可以用链表,这样把元素删除和插入都只需要常数个修改。
index90
2019-04-26 17:07:05 +08:00
C.order = (A.order+B.order)/2?
rizon
2019-04-26 17:11:46 +08:00
@Vegetable #1 你把 C 改成 1.1 之后那如果又把 B 移动到 A 和 C 之前怎么做呢? B 要改成什么呢
rizon
2019-04-26 17:12:48 +08:00
@index90 #3 就像我正文说的,这样会出现除不开的情况。你又不能四舍五入,那样会导致有可能出现重复的值
index90
2019-04-26 17:16:08 +08:00
不管是不是四舍五入,即使除得开,也会出现重复值问题。
index90
2019-04-26 17:18:10 +08:00
A 1
B 3
C 6
D 7
第一次,把 C 放到 A,B 之间
第二次,把 D 放到 A,B 之间

哦?难道你的题目是,把元素放到任意两个相邻的元素之间?
Raymon111111
2019-04-26 17:32:55 +08:00
为什么一定要限的这么死 感觉这种方案把自己逼到一个没有特别好解决方案的境地

直接顺序是定死的 1 2 3 4 5, 然后每个顺序对应谁可以变, 实现简单, 逻辑也合乎直觉
HuasLeung
2019-04-26 17:44:39 +08:00
看看能不能换个思路来玩:
要把 C 放在 A 和 B 的中间,不动 C,而是对 B 进行变大操作。
HuasLeung
2019-04-26 17:47:10 +08:00
@HuasLeung 如 B=(C+D)/2 取整
jmc891205
2019-04-26 17:47:38 +08:00
用分数来表示 order 好了
存两个 integer 一个是分子一个是分母
ziding
2019-04-26 17:47:43 +08:00
我这边是这么玩的,初始化的时候 100 为基数,调整顺序的时候( A+B )/2,如果找不到,对 B 的值进行增大处理,增大的时候,(大于 B 的+小于 B 的)/2+50,绝大部分情况不用调整很多的顺序就能找到空隙,一旦找不到,这次调整会比较慢,因为要调整较多的记录数,但是这次调整完了,后续的就会很快了。
A 100
B 200
C 300
HuasLeung
2019-04-26 17:51:34 +08:00
@HuasLeung 上面的"B=(C+D)/2 取整",当我没说过…… D 不一定存在,除非能定义一个比较合理的基数
Vegetable
2019-04-26 17:53:35 +08:00
@rizon 不存在的,这种设计在一开始就预留了足够的顺序,所以我们的排序是根据权重倒序排列,100 起步.而且这个是手动维护的,不存在一张纸能对折几次的问题.
同样我也说了这个有缺点.
pancl
2019-04-26 17:57:48 +08:00
加多一列...
zilaijuan
2019-04-26 18:00:45 +08:00
马一下。楼上说的都还是求和除以 2,楼主一开始就不考虑这个方法了
aa6563679
2019-04-26 18:06:29 +08:00
就是这样一路除下去,直到字段太长就进行一次重排
tidyoux
2019-04-26 18:09:10 +08:00
顺序信息放到内存中,在内存中更新顺序信息,定期持久化到数据库中。
gamexg
2019-04-26 18:19:16 +08:00
100
200
300

我见过很多都是这样做的,一般调整空间足够。
不够时再重新生成顺序。
jhdxr
2019-04-26 18:32:06 +08:00
@zilaijuan 上面已经有人提到了,存分数,而不是小数

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

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

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

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

© 2021 V2EX