【问题标题】:Checking if a hash table contains a value without knowledge of the key?在不知道键的情况下检查哈希表是否包含值?
【发布时间】:2014-03-24 10:40:44
【问题描述】:

有没有一种有效的方法可以在不知道用于存储它的键的情况下在哈希表中搜索一个值? 除了创建一个单独的哈希表,将键存储为值,值是键之外,我似乎想不出任何办法。

【问题讨论】:

  • 如果值也是唯一的,那么您绝对应该使用BiMap。那是一个 Guava 接口。
  • 你想检查地图中是否存在特定值吗?

标签: java data-structures hashtable


【解决方案1】:

containsValue(Object value) 方法用于检查此映射是否将一个或多个键映射到指定值。

      Hashtable htable = new Hashtable();

      htable.put(1, "A");
      htable.put(2, "B");
      boolean isavailable=htable.containsValue("A");

      // display search result
      System.out.println("Hash table contains value 'A': "+isavailable); 

【讨论】:

  • 不幸的是,我不能使用那种方法。我的任务是从头开始重建哈希表类。有没有办法查看该方法是如何编写的?
  • sry 看不懂 pblm。你能再解释一下吗
  • 我正在处理的项目不允许我导入任何 java.utils。关键是让我们从头开始重新创建 HashTable 数据结构。我想知道是否有办法查看 containsValue() 方法的代码,让我深入了解如何自己构建它。
  • ohkk 明白了。你的意思是说你需要在不使用任何java方法的情况下检查map中是否存在值。你需要从头开始编写
  • 所有公开的 Sun/Oracle 源代码都可以在 src.zip 中免费获得;如果它不在你的 jdk 目录中,你可以得到它from Oracle。如果你也想要私人课程,there's a project on sourceforge.
【解决方案2】:

如果没有任何额外的数据结构,您必须遍历整个哈希表才能找到值。由于哈希表完全由 key 的哈希索引,因此没有有效的方法来找到一些 value

如果您的哈希表存储为链接列表数组(即separate chaining),就像哈希表通常那样,您只需要两个(嵌套)循环 - 一个用于数组,一个用于链接列表在某个给定的索引处。 (如果你的哈希表使用open addressing,即一个元素数组,你只需要一个循环)。

如果允许您使用额外的数据结构,那么是的,创建一个单独的值到键的哈希表将是一个好主意。

【讨论】:

  • 谢谢。这就是我的假设。维护两个哈希表或偶尔在整个列表中进行全面搜索是否更有效?
  • 这实际上取决于您进行此搜索的频率。搜索整个集合需要相当长的时间,但维护 2 个哈希表会为每个操作带来少量开销。如果您很少按值搜索,那么一个哈希表就可以了。确切的转折点将成为基准。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2019-09-08
  • 2017-04-28
  • 1970-01-01
  • 2015-05-15
  • 2013-11-22
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多