【问题标题】:Sorting Array/ table in lua by time按时间对lua中的数组/表进行排序
【发布时间】:2014-05-28 22:14:22
【问题描述】:

我已经研究了很长一段时间的排序表,我看到了很多例子,但我似乎无法让它们工作。

我正在尝试从一个方法中获取 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 = {}
}

【问题讨论】:

  • 排序函数应该是a.secsSinceEvent[2] > b.secsSinceEvent[2] 还是类似的?因为正如所写的那样,它是常量并且不使用它的任何参数。
  • 另外,为什么要将单个事件的数据拆分为多个并行数组?为什么不只有一个事件数组,每个事件都是一个包含所有相关数据的表?
  • 嗯,我一直在尝试不同的东西?你是什​​么意思单个事件数组?在我上面的评论中添加了我认为你的意思
  • 假设我正确理解了您的代码,销售事件的各种信息位分布在 sellTest.* 表中。第 N 个事件的数据位于每个表的第 N 个索引字段中。取而代之的是一个单一的 sellHistory 表,其中包含{eventType = ..., secsSinceEvent = ..., buyer = ..., seller = ..., itemName = ..., soldAmount = ...} 左右形式的表作为其编号索引。

标签: sorting lua lua-table


【解决方案1】:

我的数组是什么样子的

您的意思是我的数组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 不首先简单地为您提供事件时间。也许他们想避开时区问题。

【讨论】:

  • 太棒了!这是有效的! :) 我在这上面花了很多时间。我的列表按降序排列,我看看能不能升序。编辑:是的,非常感谢 MUD!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2020-02-08
  • 1970-01-01
  • 2020-10-17
  • 2023-03-23
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多