一个数据队列的设计

2022-12-11 19:59:07 +08:00
 echooo0

如果一个有序队列 List 中有十个元素,要求确保每天多次取出的元素相同

第二天取有序队列中下一个元素,这样周而复始的循环

请问有没有简洁优雅的设计思路

2148 次点击
所在节点    程序员
19 条回复
JasonLaw
2022-12-11 20:15:28 +08:00
如果第二天没有获取操作,第三天获取到的元素是第二个还是第三个?
echooo0
2022-12-11 21:15:29 +08:00
@JasonLaw #1 第二个吧,有序队列,按顺序获取
echooo0
2022-12-11 21:17:02 +08:00
@JasonLaw #1 我目前想到的方案是 redis 队列 + redis key 设置到期时间 的组合来做,看起来不够优雅简洁
JasonLaw
2022-12-11 21:39:56 +08:00
@echooo0 在我看来,这其实就是一个循环链表,只需要记录当前所在的节点 current 就好,节点还会跟日期关联。

如果当前日期和当前节点日期一样,那就返回当前节点,而且不移动当前节点。
如果当前日期和当前节点日期不一样,执行 current = current.next ,然后关联当前节点和当前时间,返回当前节点。
hefish
2022-12-11 21:47:49 +08:00
感觉可以用两个指针来实现。
git00ll
2022-12-11 21:54:44 +08:00
(当前日期距离 1970-01-01 之间天数只差 - offset ) % 队列大小, 怎么样
Hurriance
2022-12-12 01:07:20 +08:00
觉得 6 楼的可行
wangritian
2022-12-12 01:27:39 +08:00
同 6 楼,第一反应就是用余数,如果后续队列元素数量变化,可以手动修改偏移将当天对齐到变化前
luozic
2022-12-12 05:12:18 +08:00
方案越简洁越好,6 楼的不错
RightHand
2022-12-12 07:20:04 +08:00
linkedHashMap 配合 list 不好吗?
xuanbg
2022-12-12 08:03:16 +08:00
这不就是个时间轮吗?轮子每天转 1 格,指针永远指向一个位置。
JasonLaw
2022-12-12 08:05:17 +08:00
@git00ll #6 offset 是什么?
JasonLaw
2022-12-12 08:10:00 +08:00
还有一点我想指出,这个需求跟队列没有任何关系,感觉很多人对队列的理解都错得很严重。

来自 Wikipedia:
In computer science, a queue is a collection of entities that are maintained in a sequence and can be modified by the addition of entities at one end of the sequence and the removal of entities from the other end of the sequence.
tusj
2022-12-13 10:08:03 +08:00
13 楼说得对,这和队列有啥关系?就 n 个固定值,来回取。没有 push ,也没有 pop 啊?
YVAN7123
2022-12-13 17:01:42 +08:00
@JasonLaw 偏移位 以保证第一天取到的是第一个
JasonLaw
2022-12-13 17:20:24 +08:00
@YVAN7123 #15 我后来再看了一下,那个-不是减号,是一个分隔符,offset 是一个描述前面中文的一个变量,我一开始以为是减号。

我一开始就想到这种方法,然后我觉得 op 可能有我在 1 楼描述的需求,所以我排除了数组 offset 这种方法,因为它不满足需求。
JasonLaw
2022-12-13 17:24:01 +08:00
@YVAN7123 #15 我上面的 comment 又理解错了,那么要实现 1 楼那种需求,offset 怎么维护?
YVAN7123
2022-12-13 17:29:49 +08:00
@JasonLaw offset
如果是每天都减的话 就是定值不需要修改.
如果不是每天都减的话,需要在没有减的一天 offset ++
JasonLaw
2022-12-13 18:30:04 +08:00
@YVAN7123 #18 这种方式维护 offset 也够复杂的😅

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

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

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

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

© 2021 V2EX