在哈希表中存储字典

use*_*644 1 java

我有一份我正在进行的任务,而且我无法掌握教授以明确某些事情.我们的想法是,我们正在使用一组给定的单词编写一个anagram解算器,我们将其存储在3个不同的字典类中:Linear,Binary和Hash.

因此,我们从文本文件中读取单词,对于前2个字典对象(线性和二进制),我们将单词存储为ArrayList ......很简单.

但对于HashDictionary,他希望我们将这些单词存储在HashTable中.我只是不确定HashTable的值是什么,或者为什么要这样做.说明说我们将这些单词存储在Hashtable中以便快速检索,但我只是不明白这一点.将字词存储在arraylist中是有意义的,但我只是不确定键/值配对如何帮助字典.

也许我没有提供足够的细节,但我想也许有人会看到类似这样的事情并且对他们来说很明显.

我们的每个类都有一个contains方法,它返回一个布尔值,表示传入的单词是否在字典中,因此线性搜索arraylist,二进制搜索arraylist,我'我不确定哈希....

che*_*ken 7

不同的是速度.这两种方法都有效,但哈希表很快.

当您使用ArrayList或任何类型List的元素查找元素时,您必须逐个检查每个列表项,直到找到所需的单词.如果这个词不在那里,你就会在整个列表中循环.

当你使用a时HashTable,你在你正在查找的单词上执行一些"魔法",称为计算单词的散列.使用该哈希值,而不是循环遍历值列表,您可以立即推断出在哪里找到您的单词 - 或者,如果您的单词在哈希中不存在,那么您的单词就不存在了.

我在这里过分简化,但这是一般的想法.您可以在此处找到另一个问题,其中包含有关哈希表如何工作的各种解释.

这是一个使用a的小代码片段HashMap.

// We will map our words to their definitions; word is the key, definition is the value
Map<String, String> dictionary = new HashMap<String, String>();
map.put("hello","A common salutation");
map.put("chicken","A delightful vessel for protein");

// Later ...
map.get("chicken"); // Returns "A delightful vessel for protein"; 
Run Code Online (Sandbox Code Playgroud)

您描述的问题要求您使用a HashMap作为满足三个要求的字典的基础:

  • 在词典中添加单词
  • 从字典中删除单词
  • 检查单词是否在词典中

使用存储键和值的映射似乎是违反直觉的,因为您真正想要的只是存储一个键(或只是一个值).但是,如上所述,a HashMap可以非常快速地找到与密钥相关的值.同样,它可以非常快速地查看是否HashMap知道关键字.我们可以通过将每个字典单词存储为密钥HashMap并将其与垃圾值相关联(因为我们不关心它)来利用这种质量,例如null.

您可以看到如何满足这三个要求,如下所示.

Map<String, Object> map = new HashMap<String, Object>();
// Add a word
map.put('word', null);

// Remove a word
map.remove('word');

// Check for the presence of a word
map.containsKey('word');
Run Code Online (Sandbox Code Playgroud)

我不想让你了解信息,但我们在这里的要求与称为a的数据结构一致Set.在Java中,常用的SetHashSet,这几乎就是你用这一部分的作业分配实现的.(事实上​​,如果这不是明确指示你使用的家庭作业HashMap,我建议你改用HashSet.)