所以我有以下代码来计算字符串中每个字母的频率(或者在文件的特定实例中):
def letter_frequency(file)
letters = 'a' .. 'z'
File.read(file) .
split(//) .
group_by {|letter| letter.downcase} .
select {|key, val| letters.include? key} .
collect {|key, val| [key, val.length]}
end
letter_frequency(ARGV[0]).sort_by {|key, val| -val}.each {|pair| p pair}
哪个效果很好,但是我想看看是否有某种东西在红宝石中做类似于此的东西,但要捕捉所有不同的可能符号?即空格,逗号,句号,以及介于两者之间的所有内容。我想更简单地说,是否有类似于'a' .. 'z'
的东西,它包含所有符号?希望有道理。
答案 0 :(得分:1)
当您尝试计算每个可能的角色时,您将不需要范围,因为每个可能的角色都是一个域。只有当您特别需要使用所述域的子集时,才应创建范围。
这可能是一个更快的实现,它计算文件中的所有字符:
def char_frequency(file_name)
ret_val = Hash.new(0)
File.open(file_name) {|file| file.each_char {|char| ret_val[char] += 1 } }
ret_val
end
p char_frequency("1003v-mm") #=> {"\r"=>56, "\n"=>56, " "=>2516, "\xC9"=>2, ...
作为参考,我使用了this test file。
答案 1 :(得分:0)
它可能不会使用Ranges的Ruby魔法,但一种简单的方法是构建一个字符计数器,它迭代字符串中的每个字符并计算总数:
class CharacterCounter
def initialize(text)
@characters = text.split("")
end
def character_frequency
character_counter = {}
@characters.each do |char|
character_counter[char] ||= 0
character_counter[char] += 1
end
character_counter
end
def unique_characters
character_frequency.map {|key, value| key}
end
def frequency_of(character)
character_frequency[character] || 0
end
end
counter = CharacterCounter.new("this is a test")
counter.character_frequency # => {"t"=>3, "h"=>1, "i"=>2, "s"=>3, " "=>3, "a"=>1, "e"=>1}
counter.unique_characters # => ["t", "h", "i", "s", " ", "a", "e"]
counter.frequency_of 't' # => 3
counter.frequency_of 'z' # => 0