没有内部迭代的三个项HashMap

时间:2009-05-06 22:08:00

标签: data-structures collections hashtable hashmap

实现三项hashMap的最佳方法是什么? 例如,我想使用常规的String键,但让它映射到两个不同的对象。这个想法就像拥有一个列表列表,除了第一个项目是一个密钥。

我试图避免遍历列表(所以行为就像一个hashmap)。你是否同意唯一的方法是建立一个新的类?似乎“HashMap3”对象(使用get1(key)& get2(key)的方法)会很有用。我不确定如何自己设置它。

如何创建集合?

4 个答案:

答案 0 :(得分:4)

如果密钥始终映射到完全两个对象,那么最简单的方法是创建一个仅存在两个对象的Pair类。然后使用String作为键,Pair实例作为值。但是,如果密钥可以映射到任意多个对象,那么IMO最好的方法是将Map中存储的值保存为某种Collection

答案 1 :(得分:0)

查看google-collections Multimap

  

类似于地图的集合,但是   这可能会关联多个值   用一把钥匙。如果你叫put(K,   V)两次,使用相同的键但是   不同的值,多​​图   包含从键到两者的映射   值。

答案 2 :(得分:0)

也许是hash of hashes

答案 3 :(得分:0)

我同意Eddie的观点,只是有很多价值观,而不是两个。我希望Java ConcurrentHashMap能够保存从Web服务获取的文档的缓存XML,并且我需要在XML旁边记录各种信息以支持缓存的驱逐策略(例如,最近最少使用,最少使用)。

解决方案只是定义一个包含这些项的对象类。我在我的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值。