假設我有一個字符串"I am a good boy"
。我希望字符串中每個字母的總數。字母區分大小寫。即D
和d
需要被認爲是兩個不同的字符。使用紅寶石句子中的字母數目
回答
"I am a good boy".scan(/\w/).inject(Hash.new(0)){|h, c| h[c] += 1; h}
# => {"I"=>1, "a"=>2, "m"=>1, "g"=>1, "o"=>3, "d"=>1, "b"=>1, "y"=>1}
+1這是我該怎麼做。它很直接,很重要。 – 2013-04-20 20:26:53
@sawa不需要你的寶貝,因爲寶石內部這樣做。您可以將該代碼複製爲答案。我將使用'gem'。@ Logan已經鏈接了該代碼。 – 2013-04-20 20:29:37
@TheMiddleMan不,我不會。我已經有我的了。沒有必要。 – sawa 2013-04-20 20:31:06
a = "I am a good boy"
a.chars.group_by(&:chr).map { |k, v| [k, v.size] }
+1另一個**好的**解決方案。 – squiguy 2013-04-20 21:57:28
@ muistooshort,因爲'a.chars.group_by(&:chr).map {| k,v | [k,v.size]}'我不認爲刪除了'空白區域'。 – 2013-04-20 22:01:17
「,因爲我認爲a.chars.group_by(&:chr).map {| k,v | [k,v.size]}沒有移除空格。」什麼?!這與空間無關。 'chars'是一個字符串中單個字符的迭代器。 'group_by(&:chr)'組,並返回一個散列,其中每個字符鍵的值都是相同字符出現的數組。 'map'將每個散列轉換爲數組的字符和大小。 'to_a'沒有必要,但可能是習慣。 「排序」是一種方便。 – 2013-04-20 22:27:42
我會使用:
str = "I am a good boy" str.scan(/[[:alpha:]]/i).each_with_object(Hash.new(0)) { |c, h| h[c] += 1 }
將返回:
{ "I" => 1, "a" => 2, "m" => 1, "g" => 1, "o" => 3, "d" => 1, "b" => 1, "y" => 1 }
我更喜歡使用scan
,因爲它會立即使用正則表達式來確定哪些字符允許被算作。如果輸入字符串包含「我是個好孩子」。一些其他的解決方案會失敗,因爲它們對於輸入字符串來說過於具體,並且每次遇到意外字符時都需要調整。我們知道,輸入很少是無效的,在現實世界中,這種代碼將用於一般句子。預先忽略不需要的字符很重要。
'Français'.scan(/[[:alpha:]]/i).each_with_object(Hash.new(0)) { |c, h| h[c] += 1 }
將返回:
{ "F" => 1, "r" => 1, "a" => 2, "n" => 1, "ç" => 1, "i" => 1, "s" => 1 }
+1 [[alpha:]] – AJcodez 2013-04-20 22:24:27
你執行了一個單一的搜索,在那裏我所有的章程,除了'白色空間'計數。但請記下您創建新對象的次數?我沒有。這裏是我的代碼去效率列表。 – 2013-04-20 22:43:48
我創建了一個新對象多少次?詳細解釋這一點,以便我們都可以從您對如何算法不好的知識中受益。 – 2013-04-21 14:34:36
這並不意味着是一個答案,只是除了現有的答案。
由於討論了性能,下面是一些數據。
require 'benchmark'
s0 = "I am a good boy"
s = s0 * 1
N = 10000
Benchmark.bm(20) do | x |
x.report('sawa') do
N.times { s.scan(/\w/).inject(Hash.new(0)){|h, c| h[c] += 1; h} }
end
x.report('digitalross') do
N.times { s.chars.to_a.sort.group_by(&:chr).map { |k, v| [k, v.size] } }
end
x.report("digitalross'") do
N.times { s.chars.group_by(&:chr).map { |k, v| [k, v.size] } }
end
x.report('rubylovely') do
N.times { s.gsub(/\s/,'').chars.with_object({}) {|c,ob| ob[c] = s.count(c)} }
end
end
給(ruby 1.9.3p392
我的機器上)
user system total real
sawa 0.600000 0.000000 0.600000 ( 0.601734)
digitalross 0.790000 0.000000 0.790000 ( 0.806674)
digitalross' 0.640000 0.010000 0.650000 ( 0.651802)
rubylovely 0.570000 0.000000 0.570000 ( 0.572501)
隨着s = s0 * 1000
和N = 10
我得到
user system total real
sawa 0.340000 0.000000 0.340000 ( 0.340617)
digitalross 0.380000 0.000000 0.380000 ( 0.411393)
digitalross' 0.230000 0.010000 0.240000 ( 0.243389)
rubylovely 6.530000 0.000000 6.530000 ( 6.603198)
所以很短的字符串,RubyLovely的解決方案的重複計算不受到傷害。實際上,它確實如此。
順便說一句,我刪除了我的答案。但是,感謝您展示「Benchmark」報告。 – 2013-04-21 05:01:19
我沒有看到拼寫出一段代碼有什麼問題,因此任何Ruby程序員(包括新手)都很容易理解它。而且,我想對這個字符串進行一次傳遞。
所以,我喜歡這樣的:
s = "I am a good boy"
def count_word_characters(s)
h = Hash.new(0)
s.each_char do |char|
next unless char =~/\w/
h[char] += 1
end
h
end
因爲:
- 可以很容易地看到散列h的創建,填寫,並輸出
- 散列h被填充在一個通通過輸入字符串
- 很明顯,我們正在跳過非單詞字符
- 1. 用紅寶石找到字母數字
- 2. 使用紅寶石檢測一個句子中的cjk字符!
- 3. 在鞋子中使用Watir(紅寶石)
- 4. Mongoid where子句紅寶石散列
- 5. 用紅寶石字母大寫第一個字母
- 6. 「資源」 - 紅寶石寶石的目錄
- 7. 如何在紅寶石中使用大寫字母方法
- 8. 紅寶石 - 使用包括case語句
- 9. 如何在紅寶石寶石中使用鉤子
- 10. 紅寶石子downcase
- 11. 紅寶石項目
- 12. 在紅寶石寶石中使用不同的寶石依賴
- 13. 紅寶石在新的子目錄
- 14. 使用紅寶石
- 15. 使用紅寶石
- 16. 使用紅寶石
- 17. 排序紅寶石數組作爲字母數字
- 18. 紅寶石條件語句
- 19. 從紅寶石寶石中使用內置的sqlite3數據庫
- 20. Node.js的紅寶石子掛
- 21. 用紅寶石計算最大並排字母數量
- 22. 紅寶石中字符的整數值?
- 23. 條件語句中的紅寶石
- 24. 紅寶石列出,但不會加載(用戶目錄中的寶石,而不是紅寶石目錄)
- 25. 紅寶石使用Heroku的
- 26. 使用紅寶石的NetCDF
- 27. 使用的libxml-紅寶石
- 28. Twitter的紅寶石寶石
- 29. 使用祖先寶石在紅寶石中創建親子孫子關係
- 30. 紅寶石,解析大寫從名稱的數組字母
在堆棧溢出中,期望您顯示您編寫的代碼以嘗試解決問題。這個問題在這裏經常被問到,所以一些搜索應該已經出現了很多如何實現它的例子。 – 2013-04-20 21:24:25
這確實看起來像我的作業 – 2013-04-21 07:29:34