如何修复错误的字符计数代码

时间:2017-04-04 22:53:26

标签: ruby string

我对我的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'字母表示或者被计算在内。

2 个答案:

答案 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