Sorting Lua表排序2
在这里,我已经尽可能多地阅读了我能找到的答案,这些答案中的标题与我的问题非常接近。我没有看到任何人有我的确切问题,所以我问了一个问题,我希望只是我对一个简单的事实一无所知 我试图编写一个记录HP(int)和距离(boolean)的表,然后按HP排序,只将范围内的值放在顶部附近Sorting Lua表排序2,sorting,lua,return,lua-table,Sorting,Lua,Return,Lua Table,在这里,我已经尽可能多地阅读了我能找到的答案,这些答案中的标题与我的问题非常接近。我没有看到任何人有我的确切问题,所以我问了一个问题,我希望只是我对一个简单的事实一无所知 我试图编写一个记录HP(int)和距离(boolean)的表,然后按HP排序,只将范围内的值放在顶部附近 local tableTest = { {hp = 64, range = true, name="Frank"}, {hp = 100, range = true, name="Joe"}, {h
local tableTest = {
{hp = 64, range = true, name="Frank"},
{hp = 100, range = true, name="Joe"},
{hp = 2, range = false, name="Jim"},
{hp = 76, range = true, name="Tim"},
{hp = 17, range = false, name="Jill"},
{hp = 16, range = true, name="Phillip"},
}
-- Sort by HP and Range to find lowest Unit in Range.
table.sort(tableTest, function(x,y) return x.hp < y.hp and x.range end)
for i=1, #tableTest do print(tableTest[i].name, tableTest[i].hp) end
我期望的结果是:
Phillip 16
Frank 64
Tim 76
Joe 100
Jim 2
Jill 17
我祈祷这只是我对table.sort如何与这样的多个检查一起工作的误解(我假设它更接近于您如何声明这样的变量)
编辑
附加信息-如果我更改
range=false
索引在表中的位置顺序,则输出也会更改(仍然不正确)。排序后,这些值只是将自己排序到不同的索引中。根据您的描述,您的订单函数需要先比较范围
,然后比较hp
table.sort(tableTest, function(x,y)
if x.range and y.range then return x.hp < y.hp
elseif x.range then return true
elseif y.range then return false
else return x.hp < y.hp end
end)
table.sort(tableTest,function(x,y)
如果是x.range和y.range,则返回x.hp
也许有一些较短的版本,但这个版本确实有效,逻辑也很清楚。你已经得到了这个问题的答案,但我认为值得在这里添加另一个版本,介绍如何更容易地推理这个逻辑。这里提出的观点实际上与语言无关
提供比较函数的目的实际上是为了回答一个问题:x应该在y之前吗?问同样问题的另一种方式是,x的优先级是否高于y?通常,您使用与
ty!我想我有点明白我做错了什么。我只是在考虑回归真的。所以,如果我想正确理解这一点,我只想确保我读的是正确的。首先,我们检查这两个范围是否为真,然后按HP排序。如果两个范围都不是真的,那么我们将查看x是否有真的范围,然后返回真,否则我们将查看y是否有范围并返回假。如果两者都为假,则我们将按HP对超出范围的进行排序。我在测试中失败的地方是elseif y.range返回false。我们这样做是为了帮助y值正确排序?@Bubba911在这种情况下,x.range
是false
,而y.range
是true
,因此x
应该在y
之后,无论hp
.Ty的值是什么,我的思想仍然围绕着它。在对自己大声说了几次之后,你所说的就是我(发帖后)想到的。听到我的理解是正确的,真是太好了!再次感谢你,希望你有一个伟大的一天你很好,先生。
table.sort(tableTest, function(x,y)
if x.range and y.range then return x.hp < y.hp
elseif x.range then return true
elseif y.range then return false
else return x.hp < y.hp end
end)
x | y | x before y?
-------------------------
T | T | x.hp < y.hp
T | F | T
F | T | F
F | F | F
return x.range and (not y.range or x.hp < y.hp)