创建anagram字典

时间:2016-03-01 15:15:04

标签: java hashtable

我必须使用哈希表创建一个anagram字典。我从用户那里接受了一个词,并且必须从我的anagram词典中输出该词中的所有字谜。

这是我目前的程序,我正在创建一个哈希函数,用于计算每个单词的哈希值,而彼此字符串的单词将具有相同的哈希值,并放在哈希表中的相同插槽中。 / p>

我遇到困难的部分是当我创建这个地图并对用户输入的单词执行我的散列函数以获得散列表的索引时,我将如何能够返回所有的值那个指数? 到目前为止,这是我的代码

func setImages() {

    var values = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]
    values.shuffleInPlace()

    button1.tag = values[0]
    button2.tag = values[1]
    button3.tag = values[2]
    button4.tag = values[3]
    button5.tag = values[4]
    button6.tag = values[5]
    button7.tag = values[6]
    button8.tag = values[7]
    button9.tag = values[8]
    button10.tag = values[9]
    button11.tag = values[10]
    button12.tag = values[11]

}

@IBAction func buttonPressed(sender: UIButton) {

    var images : [UIImage] = [
        UIImage(named:"ye1")!,
        UIImage(named:"ye2")!,
        UIImage(named:"ye3")!,
        UIImage(named:"ye4")!,
        UIImage(named:"ye5")!,
        UIImage(named:"ye6")!,
        UIImage(named:"ye7")!,
        UIImage(named:"ye8")!,
        UIImage(named:"ye9")!,
        UIImage(named:"ye10")!,
        UIImage(named:"ye11")!,
        UIImage(named:"ye12")!
    ]

    images.shuffleInPlace()

    let integrera = (sender.tag - 1)
    let imageString:String = String(format: "ye%i", integrera)

    if !firstButtonAlreadyPresssed {
        firstButtonValue = sender.tag //remember the button for later
        firstButtonAlreadyPresssed = true
        sender.setImage(UIImage(named: imageString), forState: .Normal)

    }
    else
        //We already have a first button pressed.
        if sender.tag == firstButtonValue {

        sender.setImage(UIImage(named: imageString), forState: .Normal)

        }
        else {

        let secondimage = (sender.tag)
        let secondString : String = String(format: "ye%i", secondimage)

        sender.setImage(UIImage(named: secondString), forState: .Normal)
        }
        firstButtonAlreadyPresssed = false //reset the "isFirstButton" flag for the next time.
    }
}

我相信这会在哈希表中创建anagram字典,但我不确定如何返回给定索引处的所有值。

2 个答案:

答案 0 :(得分:3)

我会使用Map<String, List<String>(或更好的Google Guava Multimap<String, String>),然后应用您的逻辑:

  • 制作单词的小写版本
  • 将小写版本的字符排序为键
  • 使用该键将单词放入地图

当用户提供输入时,您可以重复步骤1和2,但在步骤3中使用get(key),然后输入您的字谜列表。

示例:

Word = Anna - &gt; key = aann

用户输入= nana - &gt; key = aann

然后你做dictionary.get("aann")并且应该得到包含元素“Anna”的列表。

编辑:代码问题

  • 您不会显示singleAddressnumbers的声明,但我认为它是Set<String>Map<String, Integer>
  • numbers中,键是单词,值是散列。您必须迭代该映射中的所有条目,然后才能使用相同的散列检索所有条目。更好地交换它。
  • 哈希函数可能导致冲突,即非字谜的相同哈希值(例如,取“ac”和“ba”,“ac”的哈希值为{{ 1}}和“ba”它将是2 * 64 + 66 = 194)。这就是为什么Java中的哈希集和映射总是使用'​​hashCode()2 * 65 + 64 = 194 equals()_and_ hashCode(). equals()`然后用于检查密钥是否实际是相同。

答案 1 :(得分:0)

我会用     

Map<String, Collection<String>>
其KEY将是&#34;排序字符串&#34;对于一个特定的单词,它的值将是所有单词的集合,这些单词可以用你的词典中的键来创建

例如     关键:EILNST
    价值:[ELINTS,ENLIST,INLETS,LISTEN,SILENT,TINSEL]

因此,如果您想要搜索单词&#34; Listen&#34;,对单词进行排序,您将得到它的所有字谜,您必须从列表中排除单词。

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