【问题标题】:Issue with troubleshooting an error I am getting解决我遇到的错误的问题
【发布时间】:2014-10-28 16:46:42
【问题描述】:

这是我尝试运行的代码,它计算传递给它的数组中字符的频率,这是我得到的错误 frequency_string': undefined methodeach' for "a":String (NoMethodError) 。我不完全确定出了什么问题,因为这是应该工作的代码并且是给我的。对 Ruby 来说非常陌生,我花了几个小时试图自己解决这个问题。我会寻求任何帮助。

def frequency_string(chars)
    frequencies = {}
    result = ""
    chars.each do |char|
        if frequencies.has_key? char then
            frequencies = 1
        else
            frequencies[char] += 1
        end
    end
    frequencies.each do |char, freq|
        result << char << freq
    end
    return result
end
data1 = ['a', 'b', 'c', 'c', 'd', 'a', '#', 'b', '#', 'a']
puts "Data 1: " + data1.join(' ')
puts
puts frequency_string(data1)

【问题讨论】:

    标签: ruby hash each


    【解决方案1】:

    你有两个问题:

    • frequencies = 1 应该是frequencies[char] = 1。就目前而言,您正在将哈希转换为数字1
    • frequency[char] = 1frequency[char] = 1 颠倒了。

    这是您更正后的代码:

    def frequency_string(chars)
      frequencies = {}
      result = ""
      chars.each do |char|
        if frequencies.has_key? char then
          frequencies[char] += 1
        else
          frequencies[char] = 1
        end
      end
      frequencies.each do |char, freq|
        result << char << freq.to_s
      end
      result
    end
    data1 = ['a', 'b', 'c', 'c', 'd', 'a', '#', 'b', '#', 'a']
    puts "Data 1: " + data1.join(' ')
    puts
    puts frequency_string(data1)
      #=> a3b2c2d1#2
    

    随着您获得 Ruby 的使用经验,您会发现该语言允许您用很少的代码编写像这样的操作。这是一种方法:

    def frequency_string(chars)
      chars.each_with_object({}) { |char,hash|
        hash[char] = (hash[char] ||= 0) + 1 }.to_a.flatten.join
    end
    puts frequency_string(data1)
      #=> a3b2c2d1#2
    

    这可能看起来很复杂,但用不了多久你就会发现它比你写的更自然、更直接。您现在不必担心这个;我只是想让你尝尝你可以期待的东西。

    【讨论】:

      【解决方案2】:
      chars.each do |char|
          if frequencies.has_key? char then
              frequencies = 1
          else
              frequencies[char] += 1
          end
      end
      

      应该是:

      chars.each do |char|
          if frequencies.has_key? char
              frequencies[char] += 1
          else
              frequencies[char] = 1
          end
      end
      

      chars.each { |char| frequencies.has_key?(char) ? frequencies[char] += 1 : frequencies[char] = 1 }
      

      你也可以这样:

      group_by usage

      irb(main):038:0> data1.group_by { |e| e }
      => {"a"=>["a", "a", "a"], "b"=>["b", "b"], "c"=>["c", "c"], "d"=>["d"], "#"=>["#", "#"]}
      irb(main):041:0> data1.group_by { |e| data1.count(e) }
      => {3=>["a", "a", "a"], 2=>["b", "c", "c", "#", "b", "#"], 1=>["d"]} # it can be an optional if it can meet your demands
      

      改进后:

      irb(main):053:0> result = ''
      => ""
      irb(main):054:0> data1.group_by { |e| e }.each { |e| result += e[0] + e[1].count.to_s }
      => {"a"=>["a", "a", "a"], "b"=>["b", "b"], "c"=>["c", "c"], "d"=>["d"], "#"=>["#", "#"]}
      irb(main):055:0> result
      => "a3b2c2d1#2"
      

      或使用inject

      irb(main):040:0> data1.group_by { |e| e }.inject('') {|r, e| r + e[0] + e[1].count.to_s}
      => "a3b2c2d1#2"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多