あなたの問題は、あなたがしているということですがelse
を意味するelsif
を使用します。この:
elsif
print "No Key\n"
aHash[aKey] = [el]
は誤解を招くようなフォーマット、それは実際にはもっとこのように解釈される:
elsif(print "No Key\n")
aHash[aKey] = [el]
が、print
リターンをnil
はそうロジックはこのようなものです:
elsif(nil)
aHash[aKey] = [el]
とnil
が偽ブール値のコンテキストではaHash[aKey] = [el]
は発生しません。あなたがprint
を削除した場合、あなたはこれで終わる:
elsif(aHash[aKey] = [el])
と割り当てが発生します。 (配列があるので)ブール値のコンテキストでも代入は真ですが、この場合真理は無関係です。
if aHash.key?(aKey)
aHash[aKey] << el
else
aHash[aKey] = [el]
end
さらに良いことには、そのデフォルト値として(ブロック経由)Arrayでハッシュを使用することです:
現在地else
を使用したい
aHash = Hash.new { |h, k| h[k] = [ ] }
と、あなたドン
list.each do |el|
aKey = el.downcase.chars.sort.to_a.hash
aHash[aKey] << el
end
とすることができます:「Tはあなただけでこれを行うことができ、全くif
を必要としますRubyハッシュで何かをキーとして使用しても、.to_a.hash
にする必要がない場合でも、単に配列そのものをキーとして使うことができます。あなたも必要としないので、さらに、sort
はあなたの配列を与えるto_a
:
list.each { |el| aHash[el.downcase.chars.sort] << el }
誰かが、おそらく私はそれをやる、あなたの方法の終わりにreturn
文句を言うだろう:あなたは必要ありません。あなたの方法の終わりにreturn
、ちょうどaHash
を言うと、それはメソッドの戻り値になります。
def anagrams(list = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'])
aHash = Hash.new { |h, k| h[k] = [ ] }
list.each { |el| aHash[el.downcase.chars.sort] << el }
aHash
end
ます。また、さらに、それを圧縮するeach_with_object
を使用することができます。
def anagrams(list = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'])
list.each_with_object(Hash.new { |h, k| h[k] = [ ] }) do |el, h|
h[el.downcase.chars.sort] << el
end
end
が、私はおそらく、ノイズを削減するために、このようにそれを行うだろう:
def anagrams(list = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'])
h = Hash.new { |h, k| h[k] = [ ] }
list.each_with_object(h) { |el, h| h[el.downcase.chars.sort] << el }
end
ちょうどノート:それは代わりに、 '{'/'の' do'/'end'を使用するRubyで慣例です} 'ブロックが複数の行にまたがるとき。 –
また、私はこれを複製することはできません。 –