如果一个有序队列 List 中有十个元素,要求确保每天多次取出的元素相同
第二天取有序队列中下一个元素,这样周而复始的循环
请问有没有简洁优雅的设计思路
1
JasonLaw 2022-12-11 20:15:28 +08:00 via iPhone
如果第二天没有获取操作,第三天获取到的元素是第二个还是第三个?
|
3
echooo0 OP @JasonLaw #1 我目前想到的方案是 redis 队列 + redis key 设置到期时间 的组合来做,看起来不够优雅简洁
|
4
JasonLaw 2022-12-11 21:39:56 +08:00 via iPhone 1
@echooo0 在我看来,这其实就是一个循环链表,只需要记录当前所在的节点 current 就好,节点还会跟日期关联。
如果当前日期和当前节点日期一样,那就返回当前节点,而且不移动当前节点。 如果当前日期和当前节点日期不一样,执行 current = current.next ,然后关联当前节点和当前时间,返回当前节点。 |
5
hefish 2022-12-11 21:47:49 +08:00
感觉可以用两个指针来实现。
|
6
git00ll 2022-12-11 21:54:44 +08:00 1
(当前日期距离 1970-01-01 之间天数只差 - offset ) % 队列大小, 怎么样
|
7
Hurriance 2022-12-12 01:07:20 +08:00 via iPhone
觉得 6 楼的可行
|
8
wangritian 2022-12-12 01:27:39 +08:00
同 6 楼,第一反应就是用余数,如果后续队列元素数量变化,可以手动修改偏移将当天对齐到变化前
|
9
luozic 2022-12-12 05:12:18 +08:00
方案越简洁越好,6 楼的不错
|
10
RightHand 2022-12-12 07:20:04 +08:00 via Android
linkedHashMap 配合 list 不好吗?
|
11
xuanbg 2022-12-12 08:03:16 +08:00
这不就是个时间轮吗?轮子每天转 1 格,指针永远指向一个位置。
|
13
JasonLaw 2022-12-12 08:10:00 +08:00 via iPhone 1
还有一点我想指出,这个需求跟队列没有任何关系,感觉很多人对队列的理解都错得很严重。
来自 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. |
14
tusj 2022-12-13 10:08:03 +08:00
13 楼说得对,这和队列有啥关系?就 n 个固定值,来回取。没有 push ,也没有 pop 啊?
|
16
JasonLaw 2022-12-13 17:20:24 +08:00 via iPhone
@YVAN7123 #15 我后来再看了一下,那个-不是减号,是一个分隔符,offset 是一个描述前面中文的一个变量,我一开始以为是减号。
我一开始就想到这种方法,然后我觉得 op 可能有我在 1 楼描述的需求,所以我排除了数组 offset 这种方法,因为它不满足需求。 |
17
JasonLaw 2022-12-13 17:24:01 +08:00 via iPhone
@YVAN7123 #15 我上面的 comment 又理解错了,那么要实现 1 楼那种需求,offset 怎么维护?
|
18
YVAN7123 2022-12-13 17:29:49 +08:00
|