JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類(lèi)的方式
題目描述
編寫(xiě)一個(gè)類(lèi),它允許獲取和設(shè)置鍵-值對(duì),并且每個(gè)鍵都有一個(gè) 過(guò)期時(shí)間 。
該類(lèi)有三個(gè)公共方法:
set(key, value, duration)
:接收參數(shù)為整型鍵 key 、整型值 value 和以毫秒為單位的持續(xù)時(shí)間 duration 。一旦 duration 到期后,這個(gè)鍵就無(wú)法訪問(wèn)。如果相同的未過(guò)期鍵已經(jīng)存在,該方法將返回 true ,否則返回 false 。如果該鍵已經(jīng)存在,則它的值和持續(xù)時(shí)間都應(yīng)該被覆蓋。
get(key)
:如果存在一個(gè)未過(guò)期的鍵,它應(yīng)該返回這個(gè)鍵相關(guān)的值。否則返回 -1 。
count()
:返回未過(guò)期鍵的總數(shù)。
示例 1:
輸入: actions = ["TimeLimitedCache", "set", "get", "count", "get"] values = [[], [1, 42, 100], [1], [], [1]] timeDeays = [0, 0, 50, 50, 150] 輸出: [null, false, 42, 1, -1] 解釋?zhuān)? 在 t=0 時(shí),緩存被構(gòu)造。 在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 100ms 。因?yàn)樵撝挡淮嬖?,因此返回false。 在 t=50 時(shí),請(qǐng)求 key=1 并返回值 42。 在 t=50 時(shí),調(diào)用 count() ,緩存中有一個(gè)未過(guò)期的鍵。 在 t=100 時(shí),key=1 到期。 在 t=150 時(shí),調(diào)用 get(1) ,返回 -1,因?yàn)榫彺媸强盏摹?
示例 2:
輸入: actions = ["TimeLimitedCache", "set", "set", "get", "get", "get", "count"] values = [[], [1, 42, 50], [1, 50, 100], [1], [1], [1], []] timeDelays = [0, 0, 40, 50, 120, 200, 250] 輸出: [null, false, true, 50, 50, -1] 解釋?zhuān)? 在 t=0 時(shí),緩存被構(gòu)造。 在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 50ms。因?yàn)樵撝挡淮嬖?,因此返回false。 當(dāng) t=40 時(shí),添加一個(gè)鍵值對(duì) (1: 50) ,過(guò)期時(shí)間為 100ms。因?yàn)橐粋€(gè)未過(guò)期的鍵已經(jīng)存在,返回 true 并覆蓋這個(gè)鍵的舊值。 在 t=50 時(shí),調(diào)用 get(1) ,返回 50。 在 t=120 時(shí),調(diào)用 get(1) ,返回 50。 在 t=140 時(shí),key=1 過(guò)期。 在 t=200 時(shí),調(diào)用 get(1) ,但緩存為空,因此返回 -1。 在 t=250 時(shí),count() 返回0 ,因?yàn)榫彺媸强盏模瑳](méi)有未過(guò)期的鍵。
提示:
- 0 <= key, value <= 109
- 0 <= duration <= 1000
- 1 <= actions.length <= 100
- actions.length === values.length
- actions.length === timeDelays.length
- 0 <= timeDelays[i] <= 1450
- actions[i] 是 "TimeLimitedCache"、"set"、"get" 和 "count" 中的一個(gè)。
- 第一個(gè)操作始終是 "TimeLimitedCache" 而且一定會(huì)以 0 毫秒的延遲立即執(zhí)行
解題思路
1、構(gòu)造函數(shù) TimeLimitedCache 創(chuàng)建了一個(gè)新的 Map 對(duì)象,并將其賦值給實(shí)例屬性 map
var TimeLimitedCache = function () { this.map = new Map(); };
2、set 方法用于向緩存中添加一個(gè)鍵值對(duì),并設(shè)置該鍵值對(duì)的過(guò)期時(shí)間
- 首先,該方法調(diào)用 get 方法檢查緩存中是否已存在相同的鍵,如果存在,則將返回值 res 設(shè)置為 false,表示未過(guò)期的鍵已經(jīng)存在;
- 然后,創(chuàng)建一個(gè)包含 exceedTime 和 value 的對(duì)象,其中 exceedTime 表示過(guò)期時(shí)間,通過(guò)當(dāng)前時(shí)間加上指定的持續(xù)時(shí)間計(jì)算得到;
- 最后,將鍵值對(duì)存儲(chǔ)在 map 中,并返回 res。
TimeLimitedCache.prototype.set = function (key, value, duration) { let res = true; if(this.get(key) == -1) res = false; const obj = { exceedTime :new Date().getTime() + duration, value }; this.map.set(key,obj); return res; };
3、get 方法用于獲取指定鍵的值
- 首先,通過(guò)鍵從 map 中獲取對(duì)應(yīng)的值對(duì)象 obj;
- 如果找不到該鍵,則返回 -1 表示未找到;
- 然后,獲取值對(duì)象中的過(guò)期時(shí)間 exceedTime;
- 如果過(guò)期時(shí)間小于等于當(dāng)前時(shí)間,則表示鍵已過(guò)期,返回 -1;
- 否則,返回值對(duì)象的值。
TimeLimitedCache.prototype.get = function (key) { const obj = this.map.get(key); if(!obj) return -1; const exceedTime = obj.exceedTime; if(exceedTime <= new Date().getTime()) return -1; return obj.value; };
4、count 方法用于計(jì)算緩存中未過(guò)期的鍵的數(shù)量
- 首先,定義一個(gè)變量 cnt 并將其初始化為 0,用于記錄未過(guò)期的鍵的數(shù)量;
- 獲取當(dāng)前時(shí)間 dateTime;
- 然后,使用 forEach 方法遍歷 map 中的每個(gè)值對(duì)象 obj;
- 對(duì)于每個(gè)值對(duì)象,獲取其過(guò)期時(shí)間 exceedTime;
- 如果過(guò)期時(shí)間大于當(dāng)前時(shí)間,則將計(jì)數(shù)器 cnt 加一;
- 最后,返回計(jì)數(shù)器 cnt 的值。
TimeLimitedCache.prototype.count = function () { let cnt = 0; const dateTime = new Date().getTime(); this.map.forEach(obj=>{ const exceedTime = obj.exceedTime; if(exceedTime > dateTime) cnt++; }) return cnt; };
AC代碼
var TimeLimitedCache = function () { this.map = new Map(); }; /** * @param {number} key * @param {number} value * @param {number} duration time until expiration in ms * @return {boolean} if un-expired key already existed */ TimeLimitedCache.prototype.set = function (key, value, duration) { let res = true; if(this.get(key) == -1) res = false; const obj = { exceedTime :new Date().getTime() + duration, value }; this.map.set(key,obj); return res; }; /** * @param {number} key * @return {number} value associated with key */ TimeLimitedCache.prototype.get = function (key) { const obj = this.map.get(key); if(!obj) return -1; const exceedTime = obj.exceedTime; if(exceedTime <= new Date().getTime()) return -1; return obj.value; }; /** * @return {number} count of non-expired keys */ TimeLimitedCache.prototype.count = function () { let cnt = 0; const dateTime = new Date().getTime(); this.map.forEach(obj=>{ const exceedTime = obj.exceedTime; if(exceedTime > dateTime) cnt++; }) return cnt; }; /** * const timeLimitedCache = new TimeLimitedCache() * timeLimitedCache.set(1, 42, 1000); // false * timeLimitedCache.get(1) // 42 * timeLimitedCache.count() // 1 */
說(shuō)在后面
到此這篇關(guān)于JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類(lèi)的方式的文章就介紹到這了,更多相關(guān)JavaScrip緩存類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序?qū)崿F(xiàn)長(zhǎng)按 識(shí)別圖片二維碼(兩種方案)
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)長(zhǎng)按 識(shí)別圖片二維碼(兩種方案),第一種方案只需要在image里面加一個(gè)屬性就可以了,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01js實(shí)現(xiàn)HashTable(哈希表)的實(shí)例分析
本文詳細(xì)介紹javascript哈希表的實(shí)例分析及用法。下面就跟小編一起來(lái)學(xué)習(xí)下吧2016-11-11JavaScript 中的 `forEach` 無(wú)法退出循環(huán)的解決方案
在 JavaScript 中,forEach 是一個(gè)數(shù)組方法,它用來(lái)對(duì)數(shù)組中的每個(gè)元素執(zhí)行指定的回調(diào)函數(shù),為了更好地理解這個(gè)問(wèn)題,本文將通過(guò)實(shí)際項(xiàng)目代碼示例,并結(jié)合詳細(xì)的目錄結(jié)構(gòu)來(lái)進(jìn)行講解,感興趣的朋友跟隨小編一起看看吧2024-12-12uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例
在實(shí)際開(kāi)發(fā)中我們會(huì)遇到不確定高度的情況,那么在uniapp中我們?nèi)绾潍@取區(qū)域的高度吶?這篇文章主要給大家介紹了關(guān)于uniapp獲取頁(yè)面高度與元素高度的相關(guān)資料,需要的朋友可以參考下2023-09-09js獲取當(dāng)前頁(yè)面的url網(wǎng)址信息
這篇文章主要介紹了通過(guò)js如何獲取當(dāng)前頁(yè)面的url網(wǎng)址信息,需要的朋友可以參考下2014-06-06側(cè)欄跟隨滾動(dòng)的簡(jiǎn)單實(shí)現(xiàn)代碼
側(cè)欄里的有些內(nèi)容滾動(dòng)到頁(yè)面頂端以后就固定在那個(gè)位置,不再跟隨滾動(dòng)條而滾動(dòng),想必很多站長(zhǎng)朋友都想實(shí)現(xiàn)這個(gè)效果吧,接下來(lái)為大家詳細(xì)介紹下,感興趣的你可不要錯(cuò)過(guò)了哈2013-03-03Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法
今天小編就為大家分享一篇關(guān)于Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12