我有一个不同ID的数组从1到4000.我需要在数据库中添加一些元素,这些元素将包含在该数组中。由于可能的最大ID是4000(在我的情况下并不是那么多),我希望能够找到可用于我的新元素的最低未使用ID。
我知道如何在C ++中这样做,但由于我在Ruby中很新,我会寻求帮助。在C ++中,我会写一个循环,我会检查array [i] == array [i + 1] - 1.如果不是这样,那么新的id将是array [i] + 1。
我不知道如何在Ruby中编写它。
非常感谢你的帮助。
答案 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
一些解释:
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