JavaでLRUを実装したいです。
ソースコードを調べても何もわかりません。
LinkedHashMapのライブラリのコードを少しいじっただけのつもりなんですが、なぜ思ったように動かないのでしょうか?
想定ではLruChaceコンストラクタにsizeを渡して呼び出せばキャッシュサイズが変更されると考えているのですが
補足情報(FW/ツールのバージョンなど)
Eclipse
Java
1コード 2package kadai2; 3import java.util.LinkedHashMap; 4import java.util.Map; 5 6public class Main { 7 public static void main(String[] args) { 8 LruCache lru = new LruCache("A","dataA"); 9 } 10 11 private static void LruCache(String string, String string2) { 12 13 } 14 15} 16 17 class LruCache<K, V> extends LinkedHashMap<K, V> { 18 int limit; 19 20 public LruCache(int size) { 21 super(16, 0.75F, true); 22 limit = size; 23 } 24
コードはマークダウンのcodeにてご提示ください。
あとコードは書いたとおりにしか動かないわけですが、どういう動作を想定していて何が起きているのか具体的に記載してください。
また、ライブラリとは具体的にどれですか?
見たところ単にHashMapを定義しているだけに見えます。
なんのためのなんの役割を持った機能にしようとしていますか?
自身がわかっていることをきちんと説明してください
>LinkedHashMapのライブラリのコード
それはどこですか?URLを。
そもそもLinkedHashMapは単にJava標準機能であってライブラリと呼ぶほどのものではないかと。
LRUとの関連性も不明です。
>キャッシュサイズが変更されると考えているのですが
が、何が起きてますか?
https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html
です。
LRUをLinkedHashMapを使って実装しようとしています。
キャッシュが変更されたかの確認のしかたがわかりません。
正直何がわかっていないのかを説明するのもやっとの状況です。
>https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html
です。
それはあくまでAPIドキュメントですね。
java.utilもデフォルト機能なのでやはりライブラリという表現は違うと思います。
ただいずれにしても「なぜ思ったとおりに動かないのか」と書かれているので、具体的にゴールが見えている(確認の仕方もわかっていてその結果できていないことが把握できている)という印象を受けています。
どうなるものかを理解できてないとそもそも設計にすら落とし込めないと思いますが、なんのためにこれをやろうとしてるんでしょうか?
本当に何もわからない状況でできるものでもないと思います。
> 想定ではLruChaceコンストラクタにsizeを渡して呼び出せばキャッシュサイズが変更されると考えているのですが
えと、それが解決すれば質問者さんがの望むLRUキャッシュが完成するわけでないですよね。
キャッシュが変更されたかどうかの判定の前にそもそもLRU(Least Recently Used)をどう実装するか、なのではないでしょうか。単純に考えると、新規に使用されたか直近で再使用されたものを先頭に持ってくるようにして、溢れたら過去のものを削除、リストの操作で変更をしたならば即ちそれは変更があったということでしょう。
今の質問内容ではとりあえず何を最初に解決したいのか読んだ者には分からない気がします。ご提示のコードも中途で、何をポイントに聞きたいのかちょっと分かりづらいようです。
> 正直何がわかっていないのかを説明するのもやっとの状況です。
まぁ、恐らくはこれが問題なのでしょうけれども。LRUを理解するところからでは。
(LinkedHashMapじゃないような気がするのだけども...やってやれないこともないでしょうけど)