我定义了一个哈希:
sorted_words = Hash.new(0)
words.each { |word| sorted_words[word]=word.downcase.chars.sort{ |a, b| a.casecmp(b) }.join
哈希不允许使用重复键,因此如果我有cream
,scream
,scream
这样的键,它只考虑前两个键。但是我想在我的Hash中保存第三个键,并保留其适当的值。
这是一个字谜。在上面的代码之后我创建了另一个哈希,并且根据我在代码中的值,我创建了多个数组,每个数组都有一个anagram字符串。
这种情况可以解决什么问题?
答案 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