我知道队列是通过头部和/或尾部访问的集合类型。
我也明白地图是一种集合类型,它包含许多唯一的键,每个键都有一个相关的值。
我需要的是具有固定数量值的地图,其中键将被设置一次,并且在首次设置后不会被更改。
我无法理解的困难部分是将值作为具有固定长度的队列,可以推送,而不会影响密钥。
例如:
首次收集(顶部的最新项目):
Key1, Value1
Key2, Value2
Key3, Value3
添加新值NewValue后的集合:
Key1, NewValue
Key2, Value1
Key3, Value2
所以,我希望密钥保持不变,并且能够通过将最旧的值推到最后来添加新值,并将所有其他值进一步向下移动到最后。
如果框架内没有这样的类型,请有人推荐一种方法来实现它。
谢谢!
编辑: 我需要这样做的一个例子:
我需要能够访问这些值 根据它的时间段 在。中创建 例如:
键:0将包含今天的值 键:-1将包含昨天的值 键:-2将包含两天前的值
等。每次只输入一个值 一天,总有一个价值 每天都进入。
答案 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以获得所需的值。
感谢您的帮助,我只是过度思考。