2017-04-04 99 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

是的,我誤解了測試用例。對不起,浪費你的時間。我非常感謝你在空白和空白空間之間的區別 - 它在數據思考和表達我的問題方面都很有幫助 - 所以不是完全損失(無論如何)。再次感謝。 –