2017-04-04 97 views
-1

我有一个关于出现在我的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. 

我不明白为什么em pty空格由字母'e'表示或者根本不计算在内。

+0

欢迎SO。请阅读“[问]”和链接页面,以及“[mcve]”。简明明确的问题非常重要。你的问题中有很多不必要的信息。在“[mcve]”中,我们需要输入数据,这是您要计数的字符串。这可以帮助每个人解决同样的问题。 –

+1

你能告诉我们对'letter_count'的调用,它给你这种奇怪的行为吗?我怀疑你没有通过你的想法。 – Schwern

+0

我感到非常愚蠢。我查看了正在提供的测试用例,果然我误解了它们(有一个'e'字符我没有看到)。谢谢大家帮助我看到这个错误。 –

回答

0

Ruby已经有String#each_char你可以使用。

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} 

至于你为什么得到错误的字符,你确定你传递的字符串你认为你是?

+0

原来我误解了测试用例(提供的字符串)。你是完全正确的。感谢您对String#each_char的提示,我会将这一个松鼠留给以后使用。 –

0

我不明白,为什么空闲空间的由字母“E”代表或全部被计算在内。

我不能重复的问题:

def letter_count(str) 
    counts = Hash.new(0) 
    str.split("").each{|letter| counts[letter] += 1 unless letter == ""} 
    counts 
end 

letter_count('a cat') # => {"a"=>2, " "=>1, "c"=>1, "t"=>1} 

“空的空间”?没有这样的事情。空间不是空的;它被认为是空而不空:

' '.empty? # => false 

加载的ActiveSupport扩展:

require 'active_support/core_ext/object/blank' 
' '.blank? # => true 

空间是无效字符,这就是为什么他们被计算在内。如果你不想让它们计数,你必须禁止它们。

仅供参考,这里就是我会做它:

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 
+0

是的,我误解了测试用例。对不起,浪费你的时间。我非常感谢你在空白和空白空间之间的区别 - 它在数据思考和表达我的问题方面都很有帮助 - 所以不是完全损失(无论如何)。再次感谢。 –