Ruby: поиск минимального свободного идентификатора в массиве идентификаторов - PullRequest
3 голосов
/ 10 января 2012

У меня есть массив с разными идентификаторами от 1 до 4000. Мне нужно добавить некоторые элементы в базу данных с идентификатором, который будет добавлен в этот массив. Поскольку максимальный возможный идентификатор равен 4000 (что в моем случае не так много), я хотел бы найти наименьший неиспользуемый идентификатор, который я мог бы использовать для своего нового элемента.

Я бы знал, как это сделать в C ++, но, поскольку я довольно новичок в Ruby, я прошу помощи. в C ++ я бы написал цикл, в котором я бы проверил, если array [i] == array [i + 1] - 1. Если не так, то новым идентификатором будет array [i] + 1.

Я не знаю, как написать это на Ruby.

Большое спасибо за вашу помощь.

Ответы [ 5 ]

6 голосов
/ 10 января 2012

Используя диапазон, вы можете найти первый элемент, который не является частью вашего массива:

array = [1,2,3,5,6]
(1..4000).find { |i| !array.include?(i) }
# => 4
5 голосов
/ 10 января 2012
array = [1, 2, 3, 5, 6]
(1..4000).to_a.-(array).min
3 голосов
/ 10 января 2012
def first_unused_id(ids)
  index = ids.each_index.find{|i| ids[i] + 1 != ids[i+1] }
  ids[index] + 1
end

Некоторые объяснения:

  • each_index преобразует массив в перечислитель , дающий индексы массивов.
  • find вернет первый элемент, который возвращает true из переданного ему блока.
0 голосов
/ 10 января 2012
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
0 голосов
/ 10 января 2012

как насчет этого:

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

аналогично ответу Дилана, но в этом случае он просто проверяет, равен ли [n-1] член массива n.Если нет, этот индекс является «открытым» и возвращается.Это решение требует только одной проверки для каждого индекса, а не 4000 ...

, поэтому для

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

этот массив будет найден [4-1]! = 4 (потому что массив [3]= 5) и верните 4 в качестве первого доступного идентификатора.

(для этого требуется отсортированный массив индексов, но это уже предполагалось)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...