0

Possible Duplicate:
Ruby Hash with Duplicate Keys?

I defined a hash:

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

Hash does not allow the duplicate keys so if I have keys like cream, scream, scream, it only considers the first two. But I want to also have the third key saved in my Hash with its appropriate value.

This is for an anagram. After the above code I create another hash and, depending on my values from the code, I create multiple arrays with each array having the anagram string.

What could be a solution for such a situation?

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 に答える