【问题标题】:three item HashMap without internal iteration三项HashMap无内部迭代
【发布时间】:2010-10-24 08:09:06
【问题描述】:

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

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

如何创建集合?

【问题讨论】:

  • 你能详细说明一下吗?这三个项目是什么?
  • 什么意思?存储 3 个条目的哈希图?还是 key1 => key2 => value hashmap?
  • 您的意思是带有复合键的哈希图吗?

标签: data-structures collections hashtable hashmap


【解决方案1】:

如果键总是恰好映射到两个对象,那么最简单的方法是创建一个仅用于保存两个对象的Pair 类。然后你使用你的字符串作为键和Pair 实例作为值。但是,如果键可以映射到任意多个对象,那么 IMO 最好的方法是让存储在Map 中的值成为某种Collection

【讨论】:

  • 我认为这不会比构建一个处理多个值的“集合”对象更简单。似乎“HashMap3”对象(使用 get1(key) 和 get2(key) 方法)会很有用。我不确定如何自己设置。
  • 这将比构建自己的 Collection 对象方式简单。 Collection 接口很大,有很多可选的方法。 Pair 对象是微不足道的。是的,新集合的 usage(HashMap2 表示一个键的两个值)和 Pair 类的 usage 大致相同。但是创建 Pair 对象是微不足道的,创建一个新的 Collection 类很复杂,特别是如果您希望它是线程安全的并且如果您实现 all 可选方法。
  • 由于我自己似乎无法想出一个,我不得不同意。我认为 hashMap ( key , ArrayList ) 将足够简单,仍然是可扩展的,并且如果插入是一致的,则不需要迭代。这比艰难地创建新的 Collections 更简单。谢谢你的时间,埃迪。
【解决方案2】:

查看 google-collections Multimap

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

【讨论】:

  • Google Multimap 似乎返回了一个 Collection ,它仍然需要被迭代......是你提到了 Apache Flat3Map 吗?我想知道为什么该建议被删除了。
  • 我确实发布了有关 Flat3Map 的帖子,但后来意识到您需要 1 个键的 2 个值。 Flat3Map 旨在快速访问小(大小
【解决方案3】:

也许是hash of hashes

【讨论】:

  • 可能是 List 对象的散列。这似乎是最简单的解决方案,如果订单固定,我将不必迭代。
【解决方案4】:

我同意 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 值。

【讨论】:

  • 感谢 Jim 提供具体的解决方案示例。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2016-01-08
  • 2015-09-19
  • 2011-03-21
  • 2021-11-25
  • 2010-12-02
  • 2013-02-17
相关资源
最近更新 更多