Lua 粗排序,然后进行精细排序

假设我在Lua中有这个表:

items = {
    {7007, "quux", 9.7},
    {1004, "foo", 12.3},
    {1234, "bar", 9.6},
    {1234, "baz", 8.8},
}

然后我按以下方式进行排序:

function compare(a,b)
  return a[1] < b[1]
end

table.sort(items, compare)

这将导致表按第一个项排序,但由于其中有2个项的值为"1234",它们相对位置是任意的。

那么我该如何对表进行第二次排序,使得"1234"保留其在表中的绝对位置,但使用第三个值(9.6和8.8)进行精细排序呢?

点赞
用户2858170
用户2858170

你只需要在比较函数中添加更多的逻辑。比较函数的返回值告诉 Lua 哪一个元素应该先出现。如果返回 true,那么 a 就会先出现,否则 b 就会先出现。

function compare(a,b)
  if a[1] == b[1] then
    return a[3] < b[3]
  else
    return a[1] < b[1]
  end
end

或者更简短一些:

function compare(a,b)
  return a[1] < b[1] or a[1] == b[1] and a[3] < b[3]
end

这很简单。请遵循我在你类似问题中最后一个建议吗?拿起笔和纸,用英语或你的母语写下你会如何解决这个问题。

如果 a[1] 小于 b[1],那么项目 a 就会排在 b之前,否则,如果 a[1] 等于 b[1],那么如果 a[3] 小于 b[3],则 a 就会先出现。

如果你将其翻译成 Lua,它看起来像:

function compare(a, b)
  if a[1] < b[1] then
    return true
  elseif a[1] == b[1] then
    if a[3] < b[3] then
      return true
    end
  end
end

这个代码也可以工作,但是你可以像我上面展示的那样更紧凑地编写它。

2018-04-06 08:42:04