V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
echooo0
V2EX  ›  程序员

一个数据队列的设计

  •  
  •   echooo0 · 2022-12-11 19:59:07 +08:00 · 2319 次点击
    这是一个创建于 743 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    如果当前日期和当前节点日期一样,那就返回当前节点,而且不移动当前节点。
    如果当前日期和当前节点日期不一样,执行 current = current.next ,然后关联当前节点和当前时间,返回当前节点。
    hefish
        5
    hefish  
       2022-12-11 21:47:49 +08:00
    感觉可以用两个指针来实现。
    git00ll
        6
    git00ll  
       2022-12-11 21:54:44 +08:00   ❤️ 1
    (当前日期距离 1970-01-01 之间天数只差 - offset ) % 队列大小, 怎么样
    Hurriance
        7
    Hurriance  
       2022-12-12 01:07:20 +08:00 via iPhone
    觉得 6 楼的可行
    wangritian
        8
    wangritian  
       2022-12-12 01:27:39 +08:00
    同 6 楼,第一反应就是用余数,如果后续队列元素数量变化,可以手动修改偏移将当天对齐到变化前
    luozic
        9
    luozic  
       2022-12-12 05:12:18 +08:00
    方案越简洁越好,6 楼的不错
    RightHand
        10
    RightHand  
       2022-12-12 07:20:04 +08:00 via Android
    linkedHashMap 配合 list 不好吗?
    xuanbg
        11
    xuanbg  
       2022-12-12 08:03:16 +08:00
    这不就是个时间轮吗?轮子每天转 1 格,指针永远指向一个位置。
    JasonLaw
        12
    JasonLaw  
       2022-12-12 08:05:17 +08:00 via iPhone
    @git00ll #6 offset 是什么?
    JasonLaw
        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.
    tusj
        14
    tusj  
       2022-12-13 10:08:03 +08:00
    13 楼说得对,这和队列有啥关系?就 n 个固定值,来回取。没有 push ,也没有 pop 啊?
    YVAN7123
        15
    YVAN7123  
       2022-12-13 17:01:42 +08:00
    @JasonLaw 偏移位 以保证第一天取到的是第一个
    JasonLaw
        16
    JasonLaw  
       2022-12-13 17:20:24 +08:00 via iPhone
    @YVAN7123 #15 我后来再看了一下,那个-不是减号,是一个分隔符,offset 是一个描述前面中文的一个变量,我一开始以为是减号。

    我一开始就想到这种方法,然后我觉得 op 可能有我在 1 楼描述的需求,所以我排除了数组 offset 这种方法,因为它不满足需求。
    JasonLaw
        17
    JasonLaw  
       2022-12-13 17:24:01 +08:00 via iPhone
    @YVAN7123 #15 我上面的 comment 又理解错了,那么要实现 1 楼那种需求,offset 怎么维护?
    YVAN7123
        18
    YVAN7123  
       2022-12-13 17:29:49 +08:00
    @JasonLaw offset
    如果是每天都减的话 就是定值不需要修改.
    如果不是每天都减的话,需要在没有减的一天 offset ++
    JasonLaw
        19
    JasonLaw  
       2022-12-13 18:30:04 +08:00 via iPhone
    @YVAN7123 #18 这种方式维护 offset 也够复杂的😅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.