2016-08-29 1 views
2

私はここで書面による試験を受けています。分割と結合を使用するRubyキー

アナグラムである単語のグループを表示するプログラムを作成します。 アナグラムは、正確な文字が同じであるが、異なる順序の の単語です。あなたの出力は次のようになります。

["demo", "dome", "mode"] 
["neon", "none"] 

(など)

をそして、ここで、このためのソリューションです:

words = ['demo', 'none', 'tied', 'evil', 'dome', 'mode', 'live', 
      'fowl', 'veil', 'wolf', 'diet', 'vile', 'edit', 'tide', 
      'flow', 'neon'] 


result = {} 

words.each do |word| 
    key = word.split('').sort.join 
    if result.has_key?(key) 
    result[key].push(word) 
    else 
    result[key] = [word] 
    end 
end 

result.each do |k, v| 
    puts "------" 
    p v 
end 

私はRubyコードソリューションを理解しようとしてきたが、それを容易に把握することはできません。私の質問の1つは、キーがない場合、または要素が含まれていない場合、どのようにしてresultハッシュをテストすることができるかです。別のものはどのようにしていますか? joinと。 sortはこのコードで動作します。

私は本当にそれがすべての答えをどのように行くのか混乱しています。誰かが私のようにダミーである初心者の言葉で、このコードをラインごとに説明することができますか?

+0

@GaganGamiの良い説明に加えて:もしあなたが 'has_key? 'を使わなくても、キーが存在しなければ' result [key] 'という式は有効です。デフォルトでは、欠落しているキーに対しては単に 'nil'を返します。ただし、ハッシュが構築されたときに、異なるデフォルト値を要求することができます。 – user1934428

+0

あなたが答えを見つけたら、あなたが一番好きなものを選択してください。 –

答えて

7

私はこれを行うだろう:

words = ['demo', 'none', 'tied', 'evil', 'dome', 'mode', 'live', 
     'fowl', 'veil', 'wolf', 'diet', 'vile', 'edit', 'tide', 
     'flow', 'neon'] 

words.group_by { |word| word.chars.sort }.values 

#=> [["demo","dome","mode"],["none","neon"],["tied","diet","edit","tide"],["evil","live","veil","vile"],["fowl","wolf","flow"]] 
+2

[Enumerable](http://ruby-doc.org/core-2.3.1/Enumerable.html)は、この種のことを本当に簡単にします。 – tadman

+0

laymansという言葉であなたの解決策を私が理解できるようにダミーを説明することができますか? –

+0

@tadman、それは見た目が簡単です。より大きなセットに対処する効率の問題があります。 –

2

は、私はあなたのためのコードを説明します。

これは文字列から文字の配列を作成し、アルファベット順に文字を並べ替えて文字を新しい文字列に結合します。このようにして、ハッシュのキーが作成されます。

たとえば、単語「モード」は['d', 'e', 'm', 'o']のソートよりも配列['m', 'o', 'd', 'e']に変換されるので、最後のキー文字列は「デモ」になります。このようにして、単語「モード」と「デモ」は同じキーをハッシュに持つでしょう。

if result.has_key?(key) 
    result[key].push(word) 
else 
    result[key] = [word] 
end 

条件チェックの分岐がハッシュが与えられたキーを持っている場合、それがなければ、それは、配列に単語を追加した場合。それ以外の場合は、配列にキーの単語だけを割り当てます。

+1

ここで 'result = Hash.new {| h、k | h [k] = []} 'は多くの条件付き作業を節約します。それで、あなたは '結果[キー] <<単語 – tadman

関連する問題