2016-03-01 88 views
1

我必须使用散列表创建anagram字典。我从用户那里接收一个单词,并且必须从我的字典中输出该单词的所有字母。制作anagram字典

这是我目前的程序,我创建了一个散列函数来计算每个单词的散列值,并且eachother的字母散列值将具有相同的散列值,并放置在散列表中的同一个插槽中。

我遇到困难的部分是,当我创建此映射并对用户输入的单词执行散列函数以获取散列表的索引时,如何才能够返回所有那些在该散列表中的值指数? 这是到目前为止我的代码

fis = new FileInputStream(file); 
BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 

System.out.println("Total file size to read (in bytes) : " + fis.available()); 

String content = new String(); 

while ((content = br.readLine()) != null) { 
    singleAddress.add(content); 
} 

for(int i = 0; i<singleAddress.size(); i++) 
{ 
    char[] chars = singleAddress.get(i).toCharArray(); 
    Arrays.sort(chars); 
    int hash = 0; 
    for(int j = 0; j<chars.length; j++) 
    { 
     hash = 2*hash + (int)chars[j]; 
    } 
    numbers.put(singleAddress.get(i), hash); 
    System.out.println(hash + " " + i); 
} 

我相信这将创建一个哈希表字谜解释,但我不知道我怎么会定索引处返回所有的值。

+0

没有办法脱身的'HashMap'一组,它的键与给定的键冲突的所有值。众所周知,_collision_的概念是一个内部实现细节。 OTOH,如果你想写你自己的'HashMap'版本,那么,这是另一回事。你可以做你想做的。 –

回答

3

我会使用一个Map<String, List<String>(或更好的谷歌番石榴Multimap<String, String>),然后运用你的逻辑:

  • 让你的单词的小写版本的字符为小写版本
  • 排序一键
  • 使用该密钥来把这个词到地图

当用户提供输入重复步骤1和2,但使用get(key)在第3步,并且你有你的名单的anagrams。

例子:

字=安娜 - >键= AANN

用户输入=奈奈 - >键= AANN

然后你做dictionary.get("aann")和应该得到含有元素 “安娜” 名单。

编辑:与您的代码

  • 问题你没有表现的singleAddressnumbers声明,但我认为这是一个Set<String>Map<String, Integer>
  • numbers键是单词,值是散列。您必须遍历该映射中的所有条目,然后才能检索具有相同散列的所有条目。更好地交换它。
  • 散列函数威力导致冲突,即,对于非字谜相同的散列值(作为一个例子取“AC”和“BA”,为“AC”的散列将2 * 64 + 66 = 194和“BA”,它将是2 * 65 + 64 = 194)。这就是为什么哈希集和Java中的映射总是使用'​​hashCode()_and_ equals(). hashCode()is used to get the bucket which is a list in the map while equals()`然后用于检查键是否实际上是相同的。
+0

不幸的是,我不得不使用散列表/散列表,因为它是分配的规范之一。是的,你是正确的关于singleAddress和数字。 所以我希望散列是关键和价值的单词?因此,我不得不将哈希变成一个字符串,并将该字变成一个int是正确的? – MVantastic

+0

@MVantastic'HashMap >'_is_ a'Map >':) – Thomas

+0

@MVantastic至于你的问题:不,你可以交换类型,例如: 'Map '等问题仍然是你的哈希函数。正如我所说的,我只是使用字符串的标准化版本(即小写和字符排序)作为关键 - 请参阅我的示例。 – Thomas

0

我会用一个

Map<String, Collection<String>>
其主要是“排序字符串”为一个特定的词和它的价值将是所有的话可以用键来实现,他们都在你的字典集合

例如
重点:EILNST
值:[ELINTS,争取,进气口,听着,沉默不语,华而不实]

所以,在-如果你要搜索词“听”,排序的话,你会得到一切anagrams为它,你必须排除单词形式的检索列表。

参考的解决方案: Best algorithm to find anagram of word from dictonary