我想找到数组中最长的数字序列,如下所示:
string = input.scan(/(\d+)/)
string.max_by(&:length)
但是,在输出中我只得到数组中的第一个值。
整个代码是:
puts "Enter a string with letters and numbers"
input = gets
string = input.scan(/(\d+)/)
puts string.max_by(&:length)
我尝试使用其他方法,只是为了测试它们的工作方式,结果证明它们都不起作用,即使是那些我从工作示例中复制过的方法。什么可能是错的?
答案 0 :(得分:6)
问题出在String#scan
,而不是max_by
:
"12 3456 789".scan(/(\d+)/)
# [["12"], ["3456"], ["789"]]
它返回一个数组数组,因为您在扫描中使用了匹配组。对于每个匹配,它返回包含所有组的数组。每个匹配中只有一个组,因此所有这些数组都只有1个元素。
max_by
正确返回第一个数组,因为它至少具有与其他数组一样多的元素。您没有注意到错误,因为数组和字符串都响应:length
。
你想:
"12 3456 789".scan(/\d+/)
# ["12", "3456", "789"]
使用max_by
:
"12 3456 789".scan(/\d+/).max_by(&:length)
# "3456"