【问题标题】:Hybrid between features of Queue and Map typesQueue 和 Map 类型的特征之间的混合
【发布时间】:2011-03-22 05:19:52
【问题描述】:

我了解队列是一种通过头部和/或尾部访问的集合类型。

我也明白 map 是一种集合类型,它包含许多唯一键,每个键都有一个关联的值。

我需要的是一个映射,具有固定数量的值,其中的键将设置一次,并且在首次设置后不会更改。

我无法理解的困难部分是让值充当具有固定长度的队列,可以推送而不影响键。

例如:

初始集合(最新项目在顶部):

Key1, Value1
Key2, Value2
Key3, Value3

添加新值NewValue后的集合:

Key1, NewValue
Key2, Value1
Key3, Value2

因此,我希望密钥保持不变,并能够添加新值,方法是将最旧的值推到末尾,并将所有其他值进一步向下移动到末尾。

如果框架中没有这样的类型,请有人推荐一种实现它的方法。

谢谢!

编辑: 我为什么需要这样做的一个例子:

我需要能够访问这些值 根据它的时间段 创建于。
示例:

键:0 将包含今天的值
键:-1 将包含昨天的值
键:-2 将包含两天前的值
等等。

每次只输入一个值 天,一个值总是 每天输入。

【问题讨论】:

  • 呃,也许您可​​以描述一下您为什么要这样做。我怀疑有更好的方法。
  • 现在添加更多信息。
  • 所以您只需添加NewValue,而无需指定它与什么键一起使用,并且您的“地图”知道它与Key1 相关联?或者你想要每个键都有一个单独的队列?还不清楚....
  • 是的,我想添加 NewValue 并将其与 Key1 关联,同时将其余值向下推到下一个键。

标签: java collections map queue


【解决方案1】:

听起来你可以使用:

new LinkedHashMap<Long,V>(initialCapacity, loadFactor, false) {
    protected boolean removeEldestEntry(Map.Entry<Long,V> e) {
        return size() > MAX_ENTRIES;
    }
};

要在此地图中获取或放置项目,您需要规范化您的时间戳,例如,到当天的 00:00:00.000。

这种方法的一个优点是,当违反“每天都会输入一个值”的假设时,它不会静默失败。

【讨论】:

    【解决方案2】:

    所以,您实际上是在谈论对数组的索引。

    我只是在您的对象中包装一个“ArrayList”。

    您的push 方法还会从末尾删除“最旧”元素。您将定义诸如getToday()getPriorDay(numDaysBackFromToday) 之类的方法

    但是,如果您实际上并未将日期或时间与数据一起存储,那么您会在其中使用大量幻数。您希望数据已正确加载。

    我个人会使用与LinkedHashMap 中的数据相关联的时间戳,然后反复查找您想要的那个。

    【讨论】:

      【解决方案3】:

      我重新考虑了关于幻数的问题,并决定使用带有正索引的预定义集合类型会更容易。然后,当我达到所需的最大值数时,我将简单地使 push 方法从末尾删除最后一项。

      然后我会让我的班级将 -1 解释为 1 以获得所需的值。

      谢谢你的帮助,我只是想多了。

      【讨论】:

        猜你喜欢
        • 2020-04-01
        • 1970-01-01
        • 2017-03-15
        • 2012-06-19
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 2019-02-25
        • 2011-01-14
        相关资源
        最近更新 更多