周转/解决方案在哈希中复制键

时间:2012-10-10 02:50:07

标签: ruby

  

可能重复:
  Ruby Hash with Duplicate Keys?

我定义了一个哈希:

sorted_words = Hash.new(0)
words.each { |word| sorted_words[word]=word.downcase.chars.sort{ |a, b| a.casecmp(b) }.join

哈希不允许使用重复键,因此如果我有creamscreamscream这样的键,它只考虑前两个键。但是我想在我的Hash中保存第三个键,并保留其适当的值。

这是一个字谜。在上面的代码之后我创建了另一个哈希,并且根据我在代码中的值,我创建了多个数组,每个数组都有一个anagram字符串。

这种情况可以解决什么问题?

1 个答案:

答案 0 :(得分:1)

基于你正在寻找anagram制造商的评论,这里是这样一个野兽的基础:

require 'pp'
require 'set'

words = %w[cream scream scream creams]

hash = Hash.new{ |h,k| h[k] = Set.new }

words.each do |w|
  hash[w.downcase.split('').sort] << w.downcase
end

pp hash

=> {["a", "c", "e", "m", "r"]=>#<Set: {"cream"}>,
 ["a", "c", "e", "m", "r", "s"]=>#<Set: {"scream", "creams"}>}

给定一组单词,这将创建一个哈希,其中每个键是单词中字母的排序列表。与该键关联的值是一组具有相同字母的单词。

因为该值是一个集合,所以只存储唯一的单词。

填充完哈希后,您将拥有一个可用于快速查找其他单词的词典。一句话,按照与键分解相同的方式将其分解,并将其用作查找中的键:

puts hash['creams'.downcase.split('').sort].to_a.join(', ')

输出:

scream, creams

如果需要重复(和冗余)单词:

require 'pp'
require 'set'

words = %w[cream creams scream scream]

hash = Hash.new{ |h,k| h[k] = [] }

words.each do |w|
  hash[w.downcase.split('').sort] << w.downcase
end

pp hash

=> {["a", "c", "e", "m", "r"]=>["cream"],
 ["a", "c", "e", "m", "r", "s"]=>["creams", "scream", "scream"]}

puts hash['creams'.downcase.split('').sort].to_a.sort.join(', ')

=> creams, scream, scream