我对我的counts
哈希中出现的神秘'e'字符有疑问。
我最初的方法是笨重而且不优雅:
def letter_count(str)
counts = {}
words = str.split(" ")
words.each do |word|
letters = word.split("")
letters.each do |letter|
if counts.include?(letter)
counts[letter] += 1
else
counts[letter] = 1
end
end
end
counts
end
这种方法有效,但我想让它更具可读性,所以我将其缩写为:
def letter_count(str)
counts = Hash.new(0)
str.split("").each{|letter| counts[letter] += 1 unless letter == ""}
counts
end
这是我遇到问题的地方,并使用以下方法修复了它:
str.split("").each{|letter| counts[letter] += 1 unless letter == " "} # added a space.
我不明白为什么空格由'e'字母表示或者被计算在内。
答案 0 :(得分:0)
Ruby已经有http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf你可以使用。
def char_count(string)
counts = Hash.new(0)
string.each_char { |char|
counts[char] += 1
}
return counts
end
puts char_count("Basset hounds got long ears").inspect
# {"B"=>1, "a"=>2, "s"=>4, "e"=>2, "t"=>2, " "=>4, "h"=>1,
# "o"=>3, "u"=>1, "n"=>2, "d"=>1, "g"=>2, "l"=>1, "r"=>1}
至于为什么你会得到错误的角色,你确定你传递了你认为的字符串吗?
答案 1 :(得分:0)
我不明白为什么空格由'e'字母表示或者被计算在内。
我无法复制问题:
' '.empty? # => false
“空地”?没有这样的事情。空间不是空的;它被认为是空白但不是空的:
require 'active_support/core_ext/object/blank'
' '.blank? # => true
加载ActiveSupport扩展程序:
def letter_count(str)
str.chars.each_with_object(Hash.new(0)) { |l, h| h[l] += 1 }
end
letter_count('a cat') # => {"a"=>2, " "=>1, "c"=>1, "t"=>1}
空格是有效字符,这就是为什么它们被计算在内。如果你不想要它们,你必须禁止它们。
供参考,以下是我的方法:
def letter_count(str)
str.chars.group_by { |c| c }.map { |char, chars| [char, chars.count] }.to_h
end
更麻烦的方式是:
def letter_count(str)
str.chars # => ["a", " ", "c", "a", "t"]
.group_by { |c| c } # => {"a"=>["a", "a"], " "=>[" "], "c"=>["c"], "t"=>["t"]}
.map { |char, chars| [char, chars.count] } # => [["a", 2], [" ", 1], ["c", 1], ["t", 1]]
.to_h # => {"a"=>2, " "=>1, "c"=>1, "t"=>1}
end
打破这一点:
2016-01-16 11:50:01
2016-01-16 11:48:34
2016-01-16 11:48:28
2016-01-16 11:44:29