按编号过滤数组?

时间:2015-06-24 14:50:48

标签: arrays ruby

我有一个包含数字列表的数组,例如

[10, 30, 50, 54, 56, 95, 97, 99] 

如果我提供一个例如52,它需要返回数组中的下一个最小数字,在这种情况下为50。

最干净的方法是什么?

请说明是否必须先排序数组。

6 个答案:

答案 0 :(得分:9)

我会选择这样的东西(不需要排序):

[10, 30, 50, 54, 56, 95, 97, 99].select {|n| n < 52}.max

答案 1 :(得分:2)

我认为这可以用于排序数组:

[10, 30, 50, 54, 56, 95, 97, 99].sort.reverse.find { |el| el < number }

它只是将排序方向更改为降序并找到第一个较小的元素

答案 2 :(得分:1)

使用排序数组执行此操作的另一种方法是在其反向使用Array#bsearch

[10, 30, 50, 54, 56, 95, 97, 99].reverse.bsearch { |n| n < 52 } # => 50

答案 3 :(得分:1)

使用detect代替select,因为select迭代遍历所有元素。 detect返回匹配的第一个匹配项。

数组不必排序。

[10, 30, 50, 54, 56, 95, 97, 99].sort { |a, b| b <=> a }.detect { |v| v <= 52 }

答案 4 :(得分:0)

假设数组已排序:

ary = [...]
pivot = 52
ary.partition{|n| n < pivot}[0][-1]

答案 5 :(得分:0)

您必须尝试rindex

ary.sort.rindex {|el| el < number}

并返回第一个匹配元素。