простой способ найти дыру в списке? - PullRequest
2 голосов
/ 13 августа 2011

Я использую метод grails findAllBy () для возврата списка позиций. Позиция имеет целочисленное поле с именем location, которое варьируется от 1 до 15. Мне нужно найти самое низкое место в списке позиций, которое свободно.

Например, если есть позиции в точках 1, 2 и 4, алгоритм должен вернуть 3. Если позиции 1 - 4 были заполнены, он вернет 5.

Существуют ли некоторые простые функции списка / отображения карт для получения нужного числа?

Спасибо

Ответы [ 3 ]

7 голосов
/ 13 августа 2011

Если ваш список позиций был (для краткости ограничен mx 5):

def list = [ 1, 2, 4, 5 ]

И вы знаете, что у вас максимум 5 из них, вы можете сделать:

(1..5).minus(list).min()

Что даст вам 3

2 голосов
/ 14 августа 2011

Способ Тима работает и хорош для небольших дистанций. Если у вас уже есть предметы, отсортированные по местоположению, вы можете сделать это в O (n), используя findResult

def firstMissing = 0
println list.findResult { (it.location != ++firstMissing) ? firstMissing : null }

отпечатки 3.

Если они не отсортированы, вы можете либо изменить запрос в БД, чтобы отсортировать их, либо добавить туда sort{it.location}.

2 голосов
/ 13 августа 2011

Просто еще один вариант, потому что я изначально думал, что он хочет знать первый неиспользуемый слот в списке, скажем, у вас было это:

def list = ['a', 'b', null, 'd', 'e', null, 'g']

Вы можете легко найти первый пустой слот в массиве, выполнив это:

def firstOpen = list.findIndexOf{ !it } // or it == null if you need to avoid groovy truth
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...