0

可能重复:
带有重复键的 Ruby 哈希?

我定义了一个哈希:

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 中。

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

这种情况有什么解决办法?

4

1 回答 1

1

根据您正在寻找字谜制造者的评论,这是这种野兽的基础:

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
于 2012-10-10T03:06:49.057 回答