Ruby:在ID数组中查找最低可用ID

Ruby:在ID数组中查找最低可用ID,ruby,arrays,loops,arraylist,Ruby,Arrays,Loops,Arraylist,我有一个不同ID的数组,从1到4000。我需要在数据库中添加一些元素,这些元素的ID将放在该数组中。因为最大的ID可能是4000(这在我的例子中不是那么多),我希望能够找到我的新元素可能使用的最低未使用ID 我知道如何在C++中做这件事,但是我在Ruby中很新,所以我请求帮助。在C++中,我将编写一个循环来检查数组[i]==数组[i+1] - 1。如果不是这种情况,那么新的id将是array[i]+1 我只是不知道如何用Ruby写 def first_unused_id(ids) index

我有一个不同ID的数组,从1到4000。我需要在数据库中添加一些元素,这些元素的ID将放在该数组中。因为最大的ID可能是4000(这在我的例子中不是那么多),我希望能够找到我的新元素可能使用的最低未使用ID

我知道如何在C++中做这件事,但是我在Ruby中很新,所以我请求帮助。在C++中,我将编写一个循环来检查数组[i]==数组[i+1] - 1。如果不是这种情况,那么新的id将是array[i]+1

我只是不知道如何用Ruby写

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

  • 将数组转换为给定数组索引的数组
  • 将返回从传递给它的块返回的第一个元素
    true

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

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

(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


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

将被关闭一--数组[0]将是1,而不是0;它应该是
数组[i-1]
。此外,您发布的代码根本无法正常工作,因为
!数组[i]
将始终为
false
。它应该是
array[i-1]!=i
这导致id 1在1月份表示苹果,但可能在2月份表示香蕉。正常的过程是让数据库管理id。事实上,你最多有4000个id,这让它看起来像是有意义的(比如0-4000是食品类别,4001-5000是玩具)-这是个坏主意。与Jakub Hampl的答案类似,但更简单一点+1@sawa,非常好和简洁。应该运行得很快。这确实是非常非常克利夫里使用了这一个,它是完美的工作,非常感谢你的帮助!这可能是非常低效的,因为包含?方法可以被调用上千次(这是二次复杂度)是的,第一个可用id越高,肯定会有一些缓慢(当它是3999时,会有明显的延迟)。其他答案也解决了这个问题。
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
array = [1, 2, 3, 5, 6]
(1..4000).to_a.-(array).min