摘要:循環(huán)隊(duì)列,用于保存最新的幾個(gè)值在做一個(gè)監(jiān)控,用于保存最新的監(jiān)控?cái)?shù)據(jù),需要一個(gè)集合存放監(jiān)控?cái)?shù)據(jù),當(dāng)集合滿的時(shí)候,新的監(jiān)控?cái)?shù)據(jù)需要把舊的監(jiān)控給沖掉,只保存最新的監(jiān)控?cái)?shù)據(jù)。
循環(huán)隊(duì)列,用于保存最新的幾個(gè)值
在做一個(gè)監(jiān)控,用于保存最新的監(jiān)控?cái)?shù)據(jù),需要一個(gè)集合存放監(jiān)控?cái)?shù)據(jù),當(dāng)集合滿的時(shí)候,新的監(jiān)控?cái)?shù)據(jù)需要把舊的監(jiān)控給沖掉,只保存最新的監(jiān)控?cái)?shù)據(jù)。下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)
import java.io.Serializable; /** * 基于數(shù)據(jù)實(shí)現(xiàn)的循環(huán)隊(duì)列,用于存取最新的固定長(zhǎng)度的數(shù)據(jù) * * @author WangJun* @version 1.0 15/9/16 * @since 1.6 */ public class CycleQueue implements Serializable { /** * 數(shù)組下一個(gè)索引位置 */ private int index; /** * 循環(huán)隊(duì)列的大小 */ private int length; /** * 是否隊(duì)列已處于循環(huán)轉(zhuǎn)態(tài) */ private boolean cycle; /** * 存取具體數(shù)據(jù)的容器 */ private Object[] data; /** * 利用指定大小的值初始化循環(huán)隊(duì)列容器 * * @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++; } /** * 獲取目前容器內(nèi)的所有值 * 注意當(dāng)集合未滿時(shí),未存放值得地方會(huì)返回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; } /** * 獲取容器內(nèi)的最新值 * * @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; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64651.html
摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。隊(duì)列和棧類似,也是一個(gè)遵循特殊規(guī)則約束的數(shù)據(jù)結(jié)構(gòu)。將沒有元素的隊(duì)列稱之為空隊(duì),往隊(duì)列中插入元素的過程稱之為入隊(duì),從隊(duì)列中移除元素的過程稱之為出隊(duì)。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列(queue)的概念、存儲(chǔ)結(jié)構(gòu)、隊(duì)列的特點(diǎn)...
摘要:為了方便大家查閱,筆者在這里貼出相關(guān)的地址版數(shù)據(jù)結(jié)構(gòu)數(shù)組版數(shù)據(jù)結(jié)構(gòu)棧版數(shù)據(jù)結(jié)構(gòu)隊(duì)列數(shù)組隊(duì)列為了解決數(shù)組隊(duì)列帶來的問題,本篇給大家介紹一下循環(huán)隊(duì)列。 前情回顧 在上一篇,筆者給大家介紹了數(shù)組隊(duì)列,并且在文末提出了數(shù)組隊(duì)列實(shí)現(xiàn)上的劣勢(shì),以及帶來的性能問題(因?yàn)閿?shù)組隊(duì)列,在出隊(duì)的時(shí)候,我們往往要將數(shù)組中的元素往前挪動(dòng)一個(gè)位置,這個(gè)動(dòng)作的時(shí)間復(fù)雜度O(n)級(jí)別),如果不清楚的小伙伴歡迎查看閱讀...
摘要:在這個(gè)等待通知機(jī)制中,我們需要考慮以下四個(gè)要素。何時(shí)等待線程要求的條件不滿足就等待。是會(huì)隨機(jī)地通知等待隊(duì)列中的一個(gè)線程,而會(huì)通知等待隊(duì)列中的所有線程。 由上一篇文章你應(yīng)該已經(jīng)知道,在 破壞占用且等待條件 的時(shí)候,如果轉(zhuǎn)出賬本和轉(zhuǎn)入賬本不滿足同時(shí)在文件架上這個(gè)條件,就用死循環(huán)的方式來循環(huán)等待,核心代碼如下: // 一次性申請(qǐng)轉(zhuǎn)出賬戶和轉(zhuǎn)入賬戶,直到成功 while(!actr.apply...
摘要:實(shí)現(xiàn)隊(duì)列介紹隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出,隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。實(shí)現(xiàn)這次使用順序隊(duì)列實(shí)現(xiàn)。 Java 實(shí)現(xiàn)隊(duì)列 介紹 隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出(FIFO),隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。 Java 實(shí)現(xiàn) 這次使用順序隊(duì)列實(shí)現(xiàn)。(使用數(shù)組),why?為什么不直接使用順序表作為底層容器,因?yàn)槿腙?duì)操作執(zhí)行順序表尾插入,時(shí)間復(fù)雜度為O(1) O(1) 普通語...
閱讀 4678·2021-09-26 09:55
閱讀 1447·2019-12-27 12:16
閱讀 924·2019-08-30 15:56
閱讀 1931·2019-08-30 14:05
閱讀 1018·2019-08-30 13:05
閱讀 1296·2019-08-30 10:59
閱讀 1486·2019-08-26 16:19
閱讀 1909·2019-08-26 13:47