lua table.sort неправильно сортирует - PullRequest
0 голосов
/ 28 февраля 2019

Я посмотрел здесь еще несколько вопросов, но они явно не решали мой вопрос.

Я пытаюсь отсортировать массив объектов изображения по их отметке времени.При этом заметил, что table.sort не возвращает ожидаемый результат.Затем я создал следующий код, который упрощен для ясности, но показывает то же самое неожиданное поведение.

Мой вопрос таков: что я делаю неправильно, так что все индивидуальные сравнения показывают правильное значение true / false, но конечный результат находится не в порядке возрастания?

EDIT: я обнаружил, что размещениеСравнение непосредственно в вызове table.sort решает проблему, поэтому кажется, что использование внешней функции вызывает такое ошибочное поведение, кто-нибудь может объяснить почему?И есть ли способ облегчить это?

images = {1,2,4,6,5,3,88,34,8}

local function comp_time(first, second) --returns true if 'first' was taken before 'second'
        ret = first < second
        print(first..'  <  '..second..'  :  '..tostring(ret))
    return ret
end

print('unsorted:')
for i,image in ipairs(images) do
    print(i..'  :  '..image)
end
table.sort(images, function(image1, image2) comp_time(image1, image2) end)
print('sorted:')
for i,image in ipairs(images) do
    print(i..'  :  '..image)
end

Результат:

unsorted:
1  :  1
2  :  2
3  :  4
4  :  6
5  :  5
6  :  3
7  :  88
8  :  34
9  :  8
8  <  1  :  false
5  <  1  :  false
8  <  5  :  false
2  <  5  :  true
5  <  88  :  true
4  <  5  :  true
5  <  3  :  false
6  <  5  :  false
5  <  34  :  true
6  <  5  :  false
5  <  34  :  true
8  <  4  :  false
2  <  4  :  true
8  <  2  :  false
6  <  2  :  false
2  <  6  :  true
2  <  2  :  false
2  <  4  :  true
6  <  4  :  false
34  <  1  :  false
88  <  1  :  false
34  <  88  :  true
3  <  88  :  true
88  <  3  :  false
88  <  88  :  false
88  <  1  :  false
3  <  1  :  false
sorted:
1  :  1
2  :  3
3  :  88
4  :  34
5  :  5
6  :  4
7  :  6
8  :  2
9  :  8

1 Ответ

0 голосов
/ 01 марта 2019

Причина, по которой она не работала раньше, заключается в том, что ваша функция не возвращала значение, поэтому она возвращает nil, то есть falsy (т.е. это не true).Таким образом, в каком бы порядке таблица не выполнялась итерацией, было то, как элементы оказались «отсортированными».

Чтобы исправить это, вам просто нужно изменить свою функцию на return значение, т.е.

table.sort(images, function(image1, image2) return comp_time(image1, image2) end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...