用布尔值表对Lua表进行排序

我已经寻找了很久,并尝试在不同阶段完成此操作。我正在尝试根据另一个表的值对几个表进行排序。我尝试通过设定k,v(其中v是一个布尔值)来对这些表进行排序。到目前为止,我已经得到了以下内容。非常感谢您的帮助。

function byInstallsField(x,y)
  --无法理解排序
  if x.installed then return true
  elseif y.installed == false then return false
  end
end

-- var是传递到函数中的索引
-- pRect:new是一个自定义的rect绘制库

playerRect[ var ] = pRect:new(_W  + dimesion_for_rect * var, 0,
                              dimesion_for_rect,
                              dimesion_for_rect,
                              3 ) -- _x, _y , _高度, _宽度, 圆角

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和downloadedImage表进行排序,以便installed等于true的领先于数组。​

player 1.installed = true, player 2.installed = true, player 3.installed = false

点赞
用户234175
用户234175

table.sort 函数提供的比较函数必须满足严格排序关系。特别是,对于 ab,如果 byInstall(a, b) 返回 true,则 byInstall(b, a) 必须 返回 false。

这里有一个简单的例子:

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
  }
}
2013-11-14 06:22:37