我正在尝试创建一个在参数中包含字符串的函数。它应该确定字符串中的最高和最低数值,然后将其保持不变。 这是我的代码:
def high_and_low(numbers)
numbers.split
numbers.each {|x| x.to_i}
return numbers.max().to_s, numbers.min().to_s
end
这是错误:
main.rb:5:in `high_and_low': undefined method `each' for "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6":String (NoMethodError)
from main.rb:8:in `<main>'
答案 0 :(得分:1)
您尚未将值从字符串更改为数组。
将numbers.split
替换为numbers = numbers.split
。
您还需要从numbers.each { |x| x.to_i }
更改为numbers.map!(&:to_i)
。否则,您将不会在任何地方保存整数。
顺便说一句,您不必使用()
和return
(如果最后是),则可以编写[numbers.max.to_s, numbers.min.to_s]
。
类似的事情应该起作用:
def high_and_low(numbers)
numbers = numbers.split.map(&:to_i)
[numbers.max, numbers.min].map(&:to_s)
end
high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") #=> ["542", "-214"]
还有奖金(一个班轮,不是你应该这样写代码):
def high_and_low(numbers)
numbers.split.map(&:to_i).sort.values_at(-1, 0).map(&:to_s)
end
high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") #=> ["542", "-214"]
另一个答案也是一个很好的方法,所以我在这里包括它:
numbers.split.minmax_by { |n| -n.to_i }
答案 1 :(得分:0)
Ruby提供了一些不错的方法来简化此过程:
"2 1 0 -1 -2".split.map(&:to_i).minmax
# => [-2, 2]
打破现状:
"2 1 0 -1 -2".split # => ["2", "1", "0", "-1", "-2"]
.map(&:to_i) # => [2, 1, 0, -1, -2]
.minmax # => [-2, 2]
如果要返回值的字符串版本,请在一个块中比较两个整数。 minmax
将返回源数组中相应位置的值:
"2 1 0 -1 -2".split.minmax{ |a, b| a.to_i <=> b.to_i }
# => ["-2", "2"]
或:
"2 1 0 -1 -2".split.minmax_by{ |a| a.to_i }
# => ["-2", "2"]
minmax
和minmax_by
做得很重。当没有昂贵的查找来查找要比较的值时,例如在这种情况下,值位于数组中,只需要to_i
进行比较,第一种方法会更快。
*_by
版本执行一个“ Schwartzian transform”,它在比较时基本上会记住该块中的值,因此昂贵的查找仅发生一次。 (许多Enumerable方法具有*_by
版本。)当您要比较两个嵌套的值(可能是哈希数组或对象内对象内的对象)时,这些方法版本可以提高速度。 / p>
注意:比较数字的字符串版本时,比较时转换为数字值很重要。 ASCII和字符串的顺序不同于数字,因此使用to_i
。