Queue和Map类型的特征之间的混合

时间:2011-03-22 05:19:53

标签: java collections map queue

我知道队列是通过头部和/或尾部访问的集合类型。

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

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

我无法理解的困难部分是将值作为具有固定长度的队列,可以推送,而不会影响密钥。

例如:

首次收集(顶部的最新项目):

Key1, Value1
Key2, Value2
Key3, Value3

添加新值NewValue后的集合:

Key1, NewValue
Key2, Value1
Key3, Value2

所以,我希望密钥保持不变,并且能够通过将最旧的值推到最后来添加新值,并将所有其他值进一步向下移动到最后。

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

谢谢!

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

  

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

     

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

     

每次只输入一个值   一天,总有一个价值   每天都进入。

3 个答案:

答案 0 :(得分:3)

听起来你可以使用:

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

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

这种方法的一个优点是,当“每天总是输入一个值”的假设被违反时,它不会无声地失败。

答案 1 :(得分:1)

所以,你真的在​​谈论数组的索引。

我只是在你的对象中包装一个'ArrayList`。

您的push方法也会从末尾删除“最旧的”元素。您可以定义getToday()getPriorDay(numDaysBackFromToday)

等方法

但是,如果您实际上没有存储数据的日期或时间,那么您在那里使用了大量的魔术数字。您希望数据已正确加载。

我个人使用与LinkedHashMap中的数据相关联的时间戳,并迭代找到你想要的那个。

答案 2 :(得分:0)

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

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

感谢您的帮助,我只是过度思考。