在匹配值下方获取数组中的元素

时间:2016-05-13 15:05:22

标签: arrays ruby

我有一个简单的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方法中选择匹配值之前的值。

7 个答案:

答案 0 :(得分:4)

您可以将Array#takeArray#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数组中,与测试范围中的值一一对应。