不知道键名如何检查哈希表中是否包含某个值?

3

在不知道用于存储值的键的情况下,有没有一种有效的方法来搜索哈希表中的值?我似乎想不出其他方法,只能创建一个单独的哈希表,将键存储为值,而将值存储为键。


3
如果该值也是唯一的,那么您应该一定使用BiMap。这是一个Guava接口。 - Rohit Jain
你想要检查地图中是否存在特定的值,对吗? - Kick
2个回答

3
没有任何额外的数据结构,你必须循环整个哈希表来查找值。由于哈希表仅由的哈希索引,因此没有有效的方法来查找某些
如果您的哈希表存储为链接列表数组(即分离链接),则通常需要两个(嵌套)循环-一个用于数组,另一个用于给定索引处的链接列表。 (如果您的哈希表使用开放寻址,即元素数组,则只需要一个循环)。
如果允许使用额外的数据结构,则创建一个值到键的单独哈希表是一个好主意。

谢谢。那是我所假设的。维护两个哈希表是否更有效率,还是偶尔在整个列表中进行全面搜索? - super symétrie
这真的取决于您进行此搜索的频率。搜索整个集合需要相当长的时间,但维护2个哈希表每个操作都会带来一些小开销。如果您很少按值搜索,则一个哈希表就足够了。确切的转折点是需要基准测试的。 - Bernhard Barker

0

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); 

很遗憾,我不能使用那种方法。我的任务是从头开始重建哈希表类。不过有没有办法看一下那个方法是怎么写的呢? - super symétrie
抱歉,我无法理解问题。您能再解释一遍吗? - Kick
我正在开发的项目不允许我导入任何java.utils。重点是让我们从头开始重新创建HashTable数据结构。我想知道是否有一种方法可以查看containsValue()方法的代码,以便为自己构建它提供见解。 - super symétrie
哦,我明白了。你的意思是说你需要在不使用任何Java方法的情况下检查映射中是否存在该值。你需要从头开始编写代码。 - Kick
所有公共的Sun/Oracle源代码都可以在src.zip中免费获取;如果它不在你的jdk目录中,你可以从Oracle获取。如果你想要私有类,也可以在sourceforge上找到一个项目 - Paul Hicks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接