摘要:循环队列,用于保存最新的几个值在做一个监控,用于保存最新的监控数据,需要一个集合存放监控数据,当集合满的时候,新的监控数据需要把旧的监控给冲掉,只保存最新的监控数据。
循环队列,用于保存最新的几个值
在做一个监控,用于保存最新的监控数据,需要一个集合存放监控数据,当集合满的时候,新的监控数据需要把旧的监控给冲掉,只保存最新的监控数据。下面是一个简单的实现
import java.io.Serializable; /** * 基于数据实现的循环队列,用于存取最新的固定长度的数据 * * @author WangJun* @version 1.0 15/9/16 * @since 1.6 */ public class CycleQueue implements Serializable { /** * 数组下一个索引位置 */ private int index; /** * 循环队列的大小 */ private int length; /** * 是否队列已处于循环转态 */ private boolean cycle; /** * 存取具体数据的容器 */ private Object[] data; /** * 利用指定大小的值初始化循环队列容器 * * @param length */ public CycleQueue(int length) { this.length = length; data = new Object[length]; } /** * 线程安全的存入最新值到容器中 * * @param value */ public synchronized void push(E value) { if (index >= length) { index = index - length; cycle = true; } data[index] = value; index++; } /** * 获取目前容器内的所有值 * 注意当集合未满时,未存放值得地方会返回null * * @return */ public Object[] get() { Object[] truthData = new Object[length]; int currentIndex = (index - 1); if (cycle) { for (int i = (length - 1); i >= 0; i--) { if (currentIndex < 0) { truthData[i] = data[currentIndex + length]; } else { truthData[i] = data[currentIndex]; } currentIndex--; } } else { return data; } return truthData; } /** * 获取容器内的最新值 * * @return the latest value */ public E getCurrentValue() { int currentIndex = (index - 1); if (currentIndex < 0) currentIndex = 0; return (E) data[currentIndex]; } @Override public String toString() { Object[] data = get(); String res = "[ "; for (Object object : data) { res += object + ","; } res = res.substring(0, res.length() - 1); res += " ]"; return res; } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64651.html
摘要:前言数据结构与算法专题会不定时更新,欢迎各位读者监督。队列和栈类似,也是一个遵循特殊规则约束的数据结构。将没有元素的队列称之为空队,往队列中插入元素的过程称之为入队,从队列中移除元素的过程称之为出队。 声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文介绍数据结构中的队列(queue)的概念、存储结构、队列的特点...
摘要:为了方便大家查阅,笔者在这里贴出相关的地址版数据结构数组版数据结构栈版数据结构队列数组队列为了解决数组队列带来的问题,本篇给大家介绍一下循环队列。 前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n)级别),如果不清楚的小伙伴欢迎查看阅读...
摘要:在这个等待通知机制中,我们需要考虑以下四个要素。何时等待线程要求的条件不满足就等待。是会随机地通知等待队列中的一个线程,而会通知等待队列中的所有线程。 由上一篇文章你应该已经知道,在 破坏占用且等待条件 的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下: // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply...
阅读 4555·2021-09-26 09:55
阅读 1310·2019-12-27 12:16
阅读 851·2019-08-30 15:56
阅读 1862·2019-08-30 14:05
阅读 942·2019-08-30 13:05
阅读 1225·2019-08-30 10:59
阅读 1399·2019-08-26 16:19
阅读 1842·2019-08-26 13:47