3

我正在开发一个简单的朋友系统,并希望使用一些规则对friendData 进行排序。

我比较了两个朋友的状态,等级和离线时间。

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)

当我添加几个朋友时它可以工作。但是当我得到更多朋友时,它会抛出异常“排序功能无效”。有人可以告诉我如何解决吗?:)

4

1 回答 1

1

感谢@Paul Hebert 和@Egor Skriptunoff,我想通了。

关键是 compare(a,b) 和 compare(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)
于 2018-12-29T05:36:36.453 回答