【问题标题】:sorting lua tables with a table of boolean values使用布尔值表对 lua 表进行排序
【发布时间】:2013-11-14 01:15:59
【问题描述】:

我搜索了高低,并试图在不同的阶段实现这一目标。 我正在尝试对基于另一个表值的几个表进行排序。我尝试通过播种 k, v 来对这些表进行排序,其中 v 是布尔值。

这是我到目前为止所得到的。提前感谢您的帮助。

function byInstallsField(x,y) 
  -- cant seem to make sens out of the sorting 
  if x.installed then return true
  elseif y.installed == false then return false
  end
end

-- var is the index passed into the function
-- pRect:new is a custom lib for rect' drawing  

playerRect[ var ] = pRect:new(_W  + dimesion_for_rect * var, 0, 
                              dimesion_for_rect, 
                              dimesion_for_rect, 
                              3 ) -- _x, _y , _hieght, _width, round 

playerRect.installed = inst;
table.sort( playerRect, byInstallsField )

downloadedImage[ var ] = fb_friends:new(var, imageOnFile, 
                                        playerRect[ var ].x, 
                                        playerRect[ var ].y,
                                        0.25, 0.25, 0, dimesion_for_rect - 5)
downloadedImage[ var ].id = var
downloadedImage.installed = inst 
table.sort( downloadedImage, byInstallsField )

我希望对 playerRect 和下载的图像表进行排序的结果,以便安装的 that = true 将引导数组..

播放器 1.installed = true ,播放器 2.installed = true ,播放器 3.installed = false

【问题讨论】:

  • 澄清playerRect.installed = inst 的用途。看起来您有一张表格,但每个子表格都有installed 字段吗? playerRect.installed 在排序中不起作用。子表是您的比较函数中要比较的内容 - 如果 2 个子表缺少 installed 字段,它甚至不会返回值。
  • 即使byInstallsField 的两个参数都有installed 的值,该函数仍有可能不返回值(x.installed false 和y.installed true)。您的函数始终必须返回 true 或 false。另一种思考方式是,仅将 installed 为 true 的所有项目都放在 installed 为 false 的所有项目之前是不够的——您需要设计一个算法,以便 每个 一对项目,其中一个排在另一个之前。

标签: sorting lua coronasdk lua-table


【解决方案1】:

table.sort的比较函数必须满足严格排序关系。特别是,给定ab,如果byInstall(a, b) 为真,那么byInstall(b, a) 必须返回假。

这是一个简单的例子:

local player = {
  {"alice", installed = false},
  {"bob", installed = true},
  {"carol", installed = true},
  {"dave", installed = true},
  {"matthew", installed = false},
  {"steve", installed = true},
}

function byInstall(first, second)
  return first.installed and not second.installed
end

table.sort(player, byInstall)

排序后,installed = true 的子表将被组合在一起。表player 将如下所示:

{
  {
    "steve",
    installed = true
  },
  {
    "dave",
    installed = true
  },
  {
    "carol",
    installed = true
  },
  {
    "bob",
    installed = true
  },
  {
    "matthew",
    installed = false
  },
  {
    "alice",
    installed = false
  }
}

【讨论】:

  • 是的,这正是我需要的推动力,谢谢您的帮助。我完全烂透了,这就是我需要的推动力..
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 2023-03-23
  • 2013-03-20
  • 2012-04-19
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多