table.sort выбрасывает "недопустимую функцию заказа" - PullRequest
0 голосов
/ 29 декабря 2018

Я разрабатываю простую систему друзей и хочу отсортировать данные друзей по некоторым правилам.

Я сравнил статус, уровень и время офлайн двух друзей.

PS: другимеет 3 статуса. (Онлайн = 3, Занято = 2, Оффлайн = 1).

Вот мой код.

local function compare(friend1,friend2)
    local iScore1 = 0
    local iScore2 = 0
    if friend1["eStatus"] > friend2["eStatus"] then
        iScore1 = iScore1 + 1
    end
    if friend1["iLevel"] > friend2["iLevel"] then
        iScore1 = iScore1 + 1
    end
    if friend1["iOfflineTime"] < friend2["iOfflineTime"] then
        iScore1 = iScore1 + 1
    end
    return iScore1 > iScore2
end
table.sort(FriendData,compare)

Работает, когда я добавляю нескольких друзей. Но когда я получаю большедрузья, выдает исключение "недопустимая функция заказа для сортировки".Может кто-нибудь подскажите пожалуйста как это исправить?:)

1 Ответ

0 голосов
/ 29 декабря 2018

Благодаря @Paul Hebert и @Egor Skriptunoff, я понял это.

Ключ в том, что сравнение (a, b) и сравнение (b, a) должны иметь разные возвращаемые результаты.

Это означает:

  1. Когда iScore1 == iScore2, должно быть уникальное значение для сравнения (например, accountID).

  2. Разные сравниваемые значения должны иметь разные оценки.

Вот новый код.

local function compare(friend1,friend2)
    local iScore1 = 0
    local iScore2 = 0
    if friend1["eStatus"] > friend2["eStatus"] then
        iScore1 = iScore1 + 100
    elseif friend1["eStatus"] < friend2["eStatus"] then
        iScore2 = iScore2 + 100
    end
    if friend1["iLevel"] > friend2["iLevel"] then
        iScore1 = iScore1 + 10
    elseif friend1["iLevel"] < friend2["iLevel"] then
        iScore2 = iScore2 + 10
    end
    if friend1["iOfflineTime"] < friend2["iOfflineTime"] then
        iScore1 = iScore1 + 1
    elseif friend1["iOfflineTime"] > friend2["iOfflineTime"] then
        iScore2 = iScore2 + 1
    end
    if iScore1 == iScore2 then --They are both 0.
        return  friend1["accountID"] > friend2["accountID"]
    end
    return iScore1 > iScore2
end
table.sort(FriendData,compare)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...