简单的Ruby输入刮板

时间:2014-11-28 09:18:29

标签: ruby hash char

我对ruby来说是全新的,并希望对这个ruby脚本寻求帮助。

它应该接受一个字符串并找出最常出现的字符。它使用散列执行此操作,它将所有字符存储在散列中,然后遍历它以查找具有最大值的字符。截至目前,它似乎没有正常工作,我不知道为什么。就print语句而言,它可以正确地读取字符。任何帮助表示赞赏。

谢谢!

puts "Enter the string you want to search "
input = gets.chomp

charHash = Hash.new

input.split("").each do |i| 
    if charHash.has_key?(i)
        puts "incrementing"
        charHash[i]+=1
    else
        puts"storing"
        charHash.store(i, 1)
    end
end

goc = "" 
max = 0 
charHash.each { |key,value| goc = key  if value > max  }


puts "The character #{goc} occurs the most frequently"

2 个答案:

答案 0 :(得分:2)

您的代码存在两个主要问题:

  1. 正如Holger Just所评论,您必须使用+= 1代替++
  2. charHash.store(:i, 1)存储符号:i,您要存储i
  3. 将这些结果修复为正常工作的代码(我在这里使用snake_case):

    char_hash = Hash.new
    
    input.split("").each do |i|
      if char_hash.has_key?(i)
        char_hash[i] += 1
      else
        char_hash.store(i, 1)
      end
    end
    

    您可以使用0作为默认哈希值来省略条件,并且可以将split("").each替换为each_char

    char_hash = Hash.new(0)
    
    input.each_char do |i|
      char_hash[i] += 1
    end
    

    最后,您可以使用Enumerator#with_object

    将哈希传递到循环中
    char_hash = input.each_char.with_object(Hash.new(0)) { |i, h| h[i] += 1 }
    

答案 1 :(得分:2)

我可能会遗漏一些东西,但似乎不是

charHash.each { |key,value| goc = key  if value > max  }

你需要像

这样的东西
charHash.each do |key,value| 
  if value > max then
    max = value
    goc = key
  end
end

请注意max = value声明。在您当前的实现中(即不更新max变量),文本中出现的每个字符至少一次满足条件,最终得到最后一个字符。