Обработка нулей в функции сортировки
Вопрос
Я не знаю, как справиться nils
моя функция сортировки получает.
Когда у меня будет эта проверка в нем, table.sort
вылетает после нескольких звонков.
if a == nil then
return false
elseif b == nil then
return true
end
С этой ошибкой:недопустимая функция заказа для сортировки.Но согласно документации, функция сортировки должна возвращать false, если a идет после b.Верно в остальном.
Если я удалю удалить этот код, это, конечно, приведет к сбою индексации nils.
Решение
Это имеет мало или вообще ничего общего с nil
значения в таблице.Сообщение об ошибке генерируется, если сама функция сравнения недействительна.Из документации для table.sort
:
Если
comp
задано, тогда это должна быть функция, которая принимает два элемента таблицы и возвращает значение true, когда первый меньше второго (так чтоnot comp(a[i+1],a[i])
будет истинным после сортировки).
Другими словами, comp(a,b)
должно подразумевать not comp(b,a)
.Если это соотношение не выполняется, то, скорее всего, будет выдана ошибка "недопустимая функция заказа для сортировки".(Обратите внимание, что он может быть поднят не во всех случаях.)
Чтобы быть более полезными, нам действительно нужно увидеть всю функцию, переданную table.sort
.
Другие советы
Поместить все нулевые значения в начало массива:
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
Поместить все нулевые значения в конец массива:
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