我有一个简单的ruby数组,我想在匹配值的正下方选择数组中的元素。
numbers = [1,2,3,4,5,6,10]
我的匹配值是10,但我希望能够在10之前得到值,即6。
numbers.some_magical_ruby_method {|n| n == 10} # I hope to return 6 since it's the element before 10
我的问题是我在Ruby方法中选择匹配值之前的值。
答案 0 :(得分:4)
您可以将Array#take
与Array#index
:
> numbers.take(numbers.index(10).to_i).last
=> 6
如果未找到值,则返回的值为nil
。
答案 1 :(得分:3)
您可以使用此方法扩展Array类
class Array
def previous_element el
each_cons(2) {|prev, curr| return prev if curr == el }
end
end
答案 2 :(得分:3)
$route['default_controller'] = "login”;
答案 3 :(得分:2)
result = nil
index = numbers.index(10)
if index and index > 0
result = numbers[(index - 1)]
end
result
# => 6
答案 4 :(得分:2)
def number_before numbers, num
idx = numbers.index(num)
return numbers[idx - 1] unless (idx.nil? || idx == 0)
return nil
end
> numbers = [1,2,3,4,5,6,10]
> number_before numbers, 10 #=> 6
> numbers = [1,2,3]
> number_before numbers, 10 #=> nil
> numbers = [1,10,6]
> number_before numbers, 10 #=> 1
> numbers = [10,6,1]
> number_before numbers, 10 #=> nil
Find the index of 10, and returning the previous element, or nil if the number is not found or previous element is not found. The idx == 0 case is important, because the array index -1 will wrap around to the front in ruby.
答案 5 :(得分:0)
def prev_nbr(numbers, nbr)
n = nil
enum = numbers.to_enum
loop do
return n if enum.peek == nbr
n = enum.next
end
nil
end
previous_nbr(numbers, 4) #=> 3
previous_nbr(numbers, 8) #=> nil
previous_nbr(numbers, 1) #=> nil
答案 6 :(得分:0)
此答案将结果作为索引值之前索引处元素的值:
numbers[((arr_ind=numbers.index(10)).to_i > 0) ? arr_ind-1 : numbers.length]
这也可以这样写(使用nil而不是数字[numbers.length]结果):
((arr_ind=numbers.index(10)).to_i > 0) ? numbers[arr_ind-1] : nil
这些解决方案都没有遇到"包装"与简单的nil.to_i解决方案一起使用时,或者当请求的值位于数组的开头时,例如当搜索的值为0或未在数组中找到时。此解决方案避免了人为循环和过多的内存使用。
唯一的副作用是arr_ind变量如果已经存在则被创建或覆盖。
这个简短的测试展示了搜索范围(-1..13)中每个数字的结果:
numbers = [1,2,3,4,5,6,10]
def answer(arr,element)
arr[((arr_ind=arr.index(element)).to_i > 0) ? arr_ind-1 : arr.length]
end
answers = [nil, nil, nil, 1, 2, 3, 4, 5, 6, nil, nil, nil]
(-1..13).each_with_index do |number, i|
puts "#{answer(numbers,number) == answers[i] ? 'Pass' : 'Fail'}: #{number}"
end
此测试的输出显示:
Pass: -1
Pass: 0
Pass: 1
Pass: 2
Pass: 3
Pass: 4
Pass: 5
Pass: 6
Fail: 7
Pass: 8
Pass: 9
Fail: 10
Pass: 11
Pass: 12
Pass: 13
"通行证"意味着测试结果符合期望和通过; "故障"意味着它没有达到预期。预期值位于answers
数组中,与测试范围中的值一一对应。