符号的计数频率

问题描述 投票:0回答:2

所以我有以下代码来计算字符串中每个字母的频率(或在文件中的此特定实例中的频率):

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'的所有符号?希望有道理。

ruby frequency
2个回答
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


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
© www.soinside.com 2019 - 2024. All rights reserved.