为什么`String#delete`在我的ruby代码中返回错误?

时间:2016-04-23 04:22:40

标签: ruby

目标是取一个字符串并返回最常见的字母及其计数。对于字符串'hello',它将返回['l', 2]

我写了以下内容:

def most_common_letter(string)
list = []
bigcount = 0
while 0 < string.length
    count = 0
    for i in 0..string.length
        if string[0] == string[i]
            count += 1
        end
    end
    if count > bigcount
        bigcount = count
        list = (string[0])
        string.delete[string[0]]
    end
end
return [list,bigcount]  
end

我收到以下错误:

wrong number of arguments (0 for 1+)
(repl):14:in `delete'
(repl):14:in `most_common_letter'
(repl):5:in `initialize'

请帮助我理解我在delete语句中做错了什么,或者是什么导致它返回错误。

我有另一种解决办法,但我认为这样做会很好。

3 个答案:

答案 0 :(得分:3)

您正在使用delete功能错误

使用string.delete(string[0])代替string.delete[string[0]]

修改

至于你提到的无限循环。 你的条件是0 < string.length

并且您希望string.delete[string[0]]语句实际上一次删除一个字符。

但究竟是什么呢,它会删除一个字符并返回新字符串,但它实际上从未改变/更改实际的字符串。

因此,请尝试将其更改为string = string.delete[string[0]]

答案 1 :(得分:1)

除了使用已经回答的delete()代替delete[] ...

您需要的大部分内容都是在Ruby的String类中实现的。 each_charcount

def most_common_letter(string)
  max = [ nil, 0 ]
  string.each_char {|char| 
    char_count = string.count(char)
    max = [ char, char_count ] if char_count > max[1]
  }
  return max
end

答案 2 :(得分:0)

如果你允许我说,你可以用一种更容易的方式做到这一点。

def most_common_letter(string)
  h = Hash.new
  string.chars.sort.map { |c|
    h[c] = 0 if (h[c].nil?)
    h[c] = h[c] + 1
  }
  maxk = nil
  maxv = -1
  mk = h.keys
  mk.each do |k|
    if (h[k] > maxv) then
      maxk = k
      maxv = h[k]
    end
  end
  [ maxk , maxv ]
end

如果您使用

进行测试
puts most_common_letter("alcachofra")

结果将是

[ 'a', 3 ]

最后,请记住,在Ruby方法的最后,您不需要返回。分配的最后一个值将自动返回。

以Ruby方式执行Ruby!