【问题标题】:Searching Map by value field按值字段搜索地图
【发布时间】:2017-06-12 10:01:41
【问题描述】:

我有一个 Map 实现,我必须创建一个查询,使用值名称字段我需要将 Key 返回到该对象。

一种方法是通过 KeySet 使用迭代器并检查每个 Value,但效率不高。

时间是一个重要因素。

是否有任何有趣的解决方案/库可以做到这一点?

【问题讨论】:

  • 如果您需要按值快速查找键,并且您的 Map 很大,您应该考虑创建第二个 Map,其中原始值是键,原始键是值。
  • @Eran - 假设键和值都是唯一的。
  • 如果键不是唯一的,您的第二张地图可能看起来像 Map<V, List<K>>
  • @Forin 请考虑我的解决方案。谢谢

标签: java collections hashmap concurrenthashmap


【解决方案1】:

【讨论】:

    【解决方案2】:

    是的。 使用比迪地图:- Bidi Map

    Download jar

    How to use.

    例子:-

    BidiMap bidiMap = new DualHashBidiMap( );
    bidiMap.put( "il", "Illinois" );
    bidiMap.put( "az", "Arizona" );
    bidiMap.put( "va", "Virginia" );
    // Retrieve the key with a value via the inverse map
    String vaAbbreviation = bidiMap.inverseBidiMap( ).get( "Virginia" );
    
    // Retrieve the value from the key
    String illinoisName = bidiMap.get( "il" );
    

    使用相同的方法,您只需要实现 Map 的 hascode()equals() 合约。 解决方案:-

    1. 我们知道HashCode用于存储Bucket。假设hashcode2-D matrix中的行号,每一行都有entry[key,value]的链表。

    2. 实现hashcode(),这样对于每个entry[key,value],您将获得不同的`bucket no(row no)。

    3. 实现equals()方法来检查每个桶的entry[key,value]是否相等。

    4. 复杂度:- 如果您将每个 entry[key, value] 分配到不同的存储桶,那么 SEARCHINGADDING 复杂度将是 o(1)

    5. 请参考以下文档以更好地理解解决方案:-doc1doc2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多