Ruby:在ID数组中查找最低的自由ID

时间:2012-01-09 20:03:25

标签: ruby arrays loops arraylist

我有一个不同ID的数组从1到4000.我需要在数据库中添加一些元素,这些元素将包含在该数组中。由于可能的最大ID是4000(在我的情况下并不是那么多),我希望能够找到可用于我的新元素的最低未使用ID。

我知道如何在C ++中这样做,但由于我在Ruby中很新,我会寻求帮助。在C ++中,我会写一个循环,我会检查array [i] == array [i + 1] - 1.如果不是这样,那么新的id将是array [i] + 1。

我不知道如何在Ruby中编写它。

非常感谢你的帮助。

5 个答案:

答案 0 :(得分:6)

使用范围,您可以找到不属于数组的第一个元素:

array = [1,2,3,5,6]
(1..4000).find { |i| !array.include?(i) }
# => 4

答案 1 :(得分:5)

array = [1, 2, 3, 5, 6]
(1..4000).to_a.-(array).min

答案 2 :(得分:3)

def first_unused_id(ids)
  index = ids.each_index.find{|i| ids[i] + 1 != ids[i+1] }
  ids[index] + 1
end

一些解释:

  • each_index会将数组转换为Enumerator,为数组提供索引。
  • find将返回从传递给它的块返回true的第一个元素。

答案 3 :(得分:0)

这个怎么样:

(1..4000).find { |i| array[i-1] != i }

类似于Dylan的答案,但在这种情况下,它只是检查数组的[n-1]个成员是否为n。如果没有,该索引是“打开”并返回。此解决方案仅需要对每个索引进行一次检查,而不是4000 ...

所以

array = [1,2,3,5,6]

这会发现数组[4-1]!= 4(因为数组[3] = 5)并返回4作为第一个可用的id。

(这需要一个排序的索引数组,但到目前为止已经假设了)

答案 4 :(得分:0)

array = [1, 2, 3, 5, 6]

def lowest_unused(ids)
  ids.find { |e| ids.index(e) + 1 != e } - 1
end

p lowest_unused(array) # 4