LRUキャッシュを実装する。
以下に⽰す、⽂字列のKey、Valueのペアを格納するLRUキャッシュ(Mapの⼀種)を実装する。
public class LruCache {
public LruCache(int size) {}
public void put(String key, String value) {}
public String get(String key)
}
LruCacheクラスについてデータが「使われる」とはgetを実⾏されることとし、
「もっとも使われていない」とは、getを実⾏された時間がもっとも古いものとする。
使⽤例
int size = 2;
var lru = new LruCache(size);
// ⼀つも使われてない場合は最初に追加したものから消える
lru.put(“a”, “dataA”);
lru.put(“b”, “dataB”);
lru.put(“c”, “dataC”);
String v1 = lru.get(“a”); // v1はnull
// get されたら使われたとみなす
lru.put(“a”, “dataA”);
lru.put(“b”, “dataB”);
String v2 = lru.get(“a”); // v2は“dataA”
lru.put(“c”, “dataC”);
String v3 = lru.get(“b”); // v3はnull
追加課題 キャッシュサイズ変更機能の追加
実装したLRUキャッシュについて、 キャッシュ使⽤中にキャッシュサイズ変更をする機能を追加せよ。
キャッシュサイズの変更は、増減いずれも可能とする。 サイズ変更実⾏後、サイズ増減いずれの場合も正しい動作が維持されること。
日本語の問題になるかもしれませんが、上記の実装とは{}の中を記述するという意味であってますでしょうか?また、下記のコードの何が間違っているのでしょうか?
Java
1package ANS; 2 3import java.util.LinkedHashMap; 4import java.util.Map; 5 6public class LruCache extends LinkedHashMap { 7 int limit; 8 public LruCache(int size) { 9 super(); 10 limit = size; 11 } 12 public LruCache(int i, float f, boolean b) { super(i, f, b); } 13 14 protected boolean removeEldestEntry(Map.Entry eldest) { 15 return size() > limit; 16 } 17 18 public static void main(String[] args) { 19 test(new LruCache(16, 0.75f, true)); 20 } 21 static void test(Map map) { 22 for (int i = 0; i < limit; i++) { 23 map.put(i, i); 24 } 25 System.out.println(map); 26 map.get(3); 27 map.get(2); 28 System.out.println(map); 29 map.put("a","dataA"); 30 map.put("b","dataB"); 31 map.put("c","dataC"); 32 System.out.println(map); 33 map.get(1); 34 map.get(2); 35 map.get(3); 36 map.get(4); 37 System.out.println(map); 38 } 39} 40
あなたの回答
tips
プレビュー