内部反復のない3項目HashMap
-
06-07-2019 - |
質問
3項目のhashMapを実装する最良の方法は何ですか? たとえば、通常のStringキーを使用しますが、2つの異なるオブジェクトにマップします。最初のアイテムがキーであることを除いて、リストのリストを持つようなものです。
リストの繰り返し処理を回避しようとしています(そのため、動作はハッシュマップのようになります)。新しいクラスを作成することが唯一の方法だと思いますか? " HashMap3"のようです。オブジェクト(get1(key)&get2(key)のメソッドを使用)は便利です。これを自分で設定する方法がわかりません。
コレクションを作成するにはどうすればよいですか
解決
キーが常に2つのオブジェクトに正確にマッピングする場合、これを行う最も簡単な方法は、2つのオブジェクトを保持するためだけに存在する Pair
クラスを作成することです。次に、文字列をキーとして使用し、 Pair
インスタンスを値として使用します。ただし、キーが任意の数のオブジェクトにマップできる場合、IMOを実行する最良の方法は、 Map
に格納されている値を何らかの Collection
にすることです。
他のヒント
google-collections をご覧くださいマルチマップ
マップに似たコレクションですが、 複数の値を関連付けることができます 単一のキーで。 put(K、 V)2回、同じキーで 異なる値、マルチマップ キーから両方へのマッピングが含まれています 値。
A ハッシュハッシュおそらく?
私はエディに同意しますが、2つではなく、多くの値のみで同様の問題が発生しました。 Java ConcurrentHashMapに、Webサービスから取得されるドキュメントのキャッシュXMLを保持させたいので、キャッシュのエビクション戦略をサポートするために、XMLとともにさまざまな情報を記録する必要がありました(たとえば、Least Recent Used、Least Frequently Used)
解決策は、それらのアイテムを保持するオブジェクトのクラスを定義することでした。 Cacheクラス内で、次のようなプライベートネストクラスを使用しました。
private static class CacheEntry
{
private String uri; // Key
private String fetched_xml; // The XML document (main value)
private long put_time;
private long expires_time;
private long size;
private long hits;
private long last_used_time;
}
ConcurrentHashMapはURIに基づいており、次のようになりました。
private final Map<String, CacheEntry> cache;
[...]
cache = new ConcurrentHashMap<String, CacheEntry>(100, 0.75f, 3);
このコードは、新しいXMLドキュメントをキャッシュに追加します:
CacheEntry value = new CacheEntry();
value.fetched_xml(fetched_xml);
value.uri = uri;
value.put_time = System.currentTimeMillis();
value.expires_time = representation.getExpirationDate().getTime();
value.size = bytes_fetched;
value.hits = 0;
value.last_used_time = 0;
cache.put(uri, value);
編集: Javaのn個のオブジェクトの List にキーをマップする必要がある場合、それらのオブジェクトをjava.util.collections.ArrayListに配置し、 ArrayListをMap値として使用します。