以时间为基准在Lua中对数组/表进行排序

我已经研究了很长一段时间如何对表格进行排序,我看到了许多例子,但似乎无法让它们运作。

我想从一个方法中获取playerValues并将它们存储到一个表格中(我相信我已经做到了),然后我想按时间对这些值进行排序。

示例代码:

我的数组长这样:

sellTest = {}
sellTest.eventType = {}
sellTest.secsSinceEvent = {}
sellTest.buyer = {}
sellTest.seller = {}
sellTest.someParam = {}
sellTest.itemName = {}
sellTest.soldAmount = {}

我如何存储这些值:

for j = 0, totalEvents do
  for i = 0, numEvents do
    sellTest.eventType[i], sellTest.secsSinceEvent[i], sellTest.seller[i],
    sellTest.buyer[i], sellTest.someParam[i], sellTest.itemName[i],
    sellTest.soldAmount[i] = GetPlayerInfo(event(j),SELL_SALES, i )
  end
end

然后我如何尝试显示表格(出现错误):

local function sortMyTable()
  table.sort(sellTest, function(a, b) return secsSinceEvent[2]  > secsSinceEvent[2] end)

  for k,v in ipairs(sellTest) do
    print(v[1].. ' == '.. v[2])
  end
end

我知道这个表格是完全错误的,我仍在学习LUA并研究表格功能。

更新,我应该像这样存储数据吗?

示例1:

local sellTest = {}
    sellTest['eventType'] = {}
    sellTest['secsSinceEvent'] = {}

示例2:

local sellHistory = {
  eventType = {},
  secsSinceEvent = {}
}
点赞
用户501459
用户501459

将下面翻译成中文并且保留原本的 markdown 格式

我的数组长成什么样子

你是指我的数组S长成什么样子,因为你发布了其中的8个。其实只需要一个:

sellHistory = {}

这个数组的每个元素应该包含一个事件信息记录,其中包含eventTypesecsSinceEvent等字段。

for i = 0,numEvents do
   local e = {}
   e.eventType,e.secsSinceEvent,e.seller,e.buyer,e.someParam,e.itemName,e.soldAmount = GetPlayerInfo(event(j),SELL_SALES,i)
   table.insert(sellHistory,e)
end

现在按时间排序事件信息很容易:

table.sort(sellHistory,function(a,b) return a.secsSinceEvent > b.secsSinceEvent end)

然后(例如):

for i,event in ipairs(sellHistory)do
  print(event.eventType,event.secsSinceEvent,event.seller)
end

你之前做的是将事件信息写入单独的数组中,这些数组通过索引进行关联。这使得像排序这样的操作非常困难,正如你所发现的那样。


顺便说一句,我不知道你正在编写什么 API,但仅根据名称——secsSinceEvent——判断,你的逻辑可能有问题。

如果一个事件在1:00:00发生,而你在1:00:01调用GetPlayerInfo,则secsSinceEvent将为1。

如果一个事件在2:00:00发生,而你在2:00:50调用GetPlayerInfo,则secsSinceEvent将为50。

如果你按secsSinceEvent排序,你会显示第二个事件比第一个事件旧,但事实并非如此。

如果你的目的仅是保持按事件时间排序的历史记录,那么你需要使用secsSinceEvent通过从当前时间减去secsSinceEvent来计算事件的时间,并将其保存为事件的时间戳。我不确定为什么API不简单地在第一次给出事件时间。也许他们想规避时区问题。

2014-04-14 22:58:03