1

ハッシュで文字を数えるのにこの問題があります:

#Counting with hashes!
#Experiment by writing a couple of short programs that will use Hashes to count 
#objects by incrementing a key value.
#Write a funcition that will count the number of letters in a phrase.
#Example "cat in the hat"  -> return:  {"t"=>3, "h"=>2, "a"=>2, "i"=>1, "n"=>1, "e"=>1, "c"=>1}
#From descending order.  Largest to smallest.  Do not include spaces.

これが私の解決策です:

def count_letters(str)
  count = Hash.new(0)
  str.delete(" ").each_char { |letter|  count[letter]+=1}  
  Hash[count.sort_by {|k,v| v}.reverse]
end

print count_letters("cat in the hat")

降順で並べ替えるには、次のコード スニペットを配置する必要がありました。

Hash[count.sort_by {|k,v| v}.reverse]

これ以上何を屈折させることができますか? 降順ソートを行う別の方法はありますか?

これを行うより良い方法はありますか?

4

3 に答える 3

3

でソートすることで逆を避けることができます-v

def count_letters(str)
  counts = str.delete(' ').each_char.inject(Hash.new(0)) {|a,c| a[c] += 1; a}
  Hash[counts.sort_by {|_,v| -v}]
end
于 2013-10-18T23:29:12.093 に答える
2

解決:

 def  letter_count(word)
    hash = {}
    hash.default = 0 
    letters = word.downcase.chars
    letters.each do |letter| 
        hash[letter] +=1
  end
  p hash
end

答え:

letter_count("I love you")
{"i"=>1, "l"=>1, "o"=>2, "v"=>1, "e"=>1, "y"=>1, "u"=>1}
于 2015-05-21T19:04:18.900 に答える
2

通常、次のようにします。

def count_letters(s)
  Hash[s.delete(' ').split('').group_by{ |c| c }.map{ |k, v| [k, v.size] }]
end

print count_letters("cat in the hat")
# >> {"c"=>1, "a"=>2, "t"=>3, "i"=>1, "n"=>1, "h"=>2, "e"=>1}

並べ替えは簡単です。

def count_letters(s)
  Hash[
    s.delete(' ')
     .split('')
     .group_by{ |c| c }
     .map{ |k, v| [k, v.size] }
     .sort_by{ |k, v| [-v, k] }
  ]
end

print count_letters("cat in the hat")
# >> {"t"=>3, "a"=>2, "h"=>2, "c"=>1, "e"=>1, "i"=>1, "n"=>1}

結果の並べ替えは、カウントの降順であり、カウントが同じ場合は文字の昇順です。

メソッドでソートしていますが、実際の作業では、必要でない限りソートを実行せず、ソートが必要な場所でのみソートを実行します。値の取得が高速化されないため、すべてのハッシュに対してこれを行うのは無駄です。


ベンチマークの実行から、並べ替え順序を逆にするのに を使用するのが最善の方法ではないこと-vがわかっています。実際には、使用して結果の配列vに追加する方が高速です。reverse

于 2013-10-18T23:35:51.590 に答える