この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
169. LRU - Chrome storage自動消去
以下は、LRUStorageの実装です。
class LRUStorage { capacity: number; data: Map<string, OriginData>; timestamp: () => number; constructor(capacity: number, timestamp: () => number = Date.now) { this.capacity = capacity; this.data = new Map(); this.timestamp = timestamp; } private evict(): void { let oldestTime = Infinity; let oldestOrigin = ''; for (const [origin, data] of this.data.entries()) { if (data.persistent) { continue; } if (data.lastUsed < oldestTime) { oldestTime = data.lastUsed; oldestOrigin = origin; } } if (oldestOrigin) { this.data.delete(oldestOrigin); } } private touchData(origin: string): OriginData | undefined { const data = this.data.get(origin); if (!data) { return data; } data.lastUsed = this.timestamp(); return data; } getData(origin: string): OriginData | undefined { return this.touchData(origin); } setData(origin: string, size: number): boolean { this.touchData(origin); const oldData = this.data.get(origin); if (oldData) { this.data.set(origin, { ...oldData, size, lastUsed: this.timestamp() }); return true; } else { if (this.capacity < size) { return false; } while (this.capacity - size < this.totalSize()) { this.evict(); } this.data.set(origin, { origin, size, lastUsed: this.timestamp(), persistent: false }); return true; } } clearData(origin: string): void { this.data.delete(origin); } makePersistent(origin: string): void { const data = this.touchData(origin); if (data) { data.persistent = true; } } totalSize(): number { let total = 0; for (const data of this.data.values()) { total += data.size; } return total; }}
基本的には、Mapを使用し、データを格納します。そして、データに制限がかかった場合には、LRU (Least Recently Used) アルゴリズムを使用して、オリジンデータのスペースを開けます。
さらに、 getData
と setData
の呼び出し時にも、オリジンデータを最新のものにし、 getData
では、オリジンデータが存在しない場合 undefined
を返すようにしています。
最後に、 makePersistent
メソッドでは、データを永続にします。 永続的なデータは、特別にマークされ、LRUアルゴリズムによって削除されることはありません。
あなたのタイムスタンプ関数は、デフォルトで Date.now
を使用していますが、コンストラクタの二番目の引数として渡すことができます。この機能を使用することで、テスト中にタイムスタンプを固定することも可能です。