Обработка nils в функции сортировки - PullRequest
4 голосов
/ 20 января 2010

Я не знаю, как обращаться с nils, моя функция сортировки получает.

Когда у меня есть эта проверка, table.sort падает после некоторых вызовов.

if a == nil then
    return false
elseif b == nil then
    return true
end

С этой ошибкой: недопустимая функция заказа для сортировки . Но согласно документации, функция sort должна возвращать false, если a идет после b. Верно иначе.

Если я удаляю удалить этот код, он, конечно, падает при индексации nils.

Ответы [ 2 ]

12 голосов
/ 22 января 2010

Это не имеет ничего общего с nil значениями в таблице. Сообщение об ошибке генерируется, если сама функция сравнения недопустима. Из документации на table.sort:

Если дано comp, то это должно быть функция, которая получает две таблицы элементы, и возвращает истину, когда первый меньше второго (так что not comp(a[i+1],a[i]) будет правдой после сортировки).

Другими словами, comp(a,b) должно подразумевать not comp(b,a). Если это соотношение не выполняется, то, скорее всего, возникнет ошибка «недопустимая функция заказа для сортировки». (Обратите внимание, что это может произойти не во всех случаях.)

Чтобы быть более полезным, нам действительно нужно, чтобы вся функция была передана table.sort.

2 голосов
/ 20 января 2010

Чтобы поместить все значения nil в начало массива:

  function mycomp(a,b)
    if a == nil and b == nil then
      return false
    end
    if a == nil then
      return true
    end
    if b == nil then
      return false
    end
    return a < b
  end

Чтобы поместить все значения nil в конец массива:

function mycomp(a,b)
  if a == nil and b == nil then
    return false
  end
  if a == nil then
    return false
  end
  if b == nil then
    return true
  end
  return a < b
end
...