Lua:使用多个点对数字表排序

我有一个字符串表如下所示:

{
    "1",
    "1.5",
    "3.13",
    "1.2.5.7",
    "2.5",
    "1.3.5",
    "2.2.5.7.10",
    "1.17",
    "1.10.5",
    "2.3.14.9",
    "3.5.21.9.3",
    "4"
}

并且想要将其排序如下所示:

{
    "1",
    "1.2.5.7",
    "1.3.5",
    "1.5",
    "1.10.5",
    "1.17",
    "2.2.5.7.10",
    "2.3.14.9",
    "2.5",
    "3.5.21.9.3",
    "3.13",
    "4"
}

如何在Lua中进行排序?我知道需要使用table.sort(),只是不知道要使用哪个函数(第二个参数)进行比较。

点赞
用户2858170
用户2858170

table.sort 默认按升序排序。因此您无需提供第二个参数。由于您正在对字符串进行排序,Lua会逐个字符地比较字符串。因此,您必须实现一个排序函数,告诉Lua哪个在前。

我只是不知道用于比较的函数(第二个参数)。

这就是为什么人们编写了《Lua参考手册》的原因。

table.sort (list [, comp])

按给定顺序原位排序列表元素,从 list[1] 到 list[#list]。如果给定了 comp,则必须是一个函数,该函数接收两个列表元素,当第一个元素必须在最终顺序中出现在第二个元素之前时返回 true,所以,在排序之后,i <= j 意味着不 comp (list[j],list[i])。如果未提供 comp,则使用标准 Lua 运算符 <。

comp 函数必须定义一种一致的顺序;更正式地说,该函数必须定义一种严格的弱序。(弱序类似于全序,但可以为比较目的等价不同元素。)

排序算法不是稳定的:考虑由给定顺序视为相等的不同元素的相对位置可能会受到排序的影响。

想想如果您使用笔和纸该如何进行。您将比较每个数字段。一旦一个段小于另一个,您就知道这个数字在前面。

因此,解决方案可能需要您获取这些字符串的段,将它们转换为数字,以便您可以比较它们的值...

2021-08-06 13:07:19
用户1442917
用户1442917

根据你的要求,你可能需要类似于natural sort order的东西。我在博客文章中描述了几种可能的解决方案以及它们对结果的影响。

最简单的解决方案可能看起来像下面这样,但是列出了5种不同的解决方案,具有不同的复杂度和结果:

function alphanumsort(o)
  local function padnum(d) return ("%03d%s"):format(#d, d) end
  table.sort(o, function(a,b)
    return tostring(a):gsub("%d+",padnum) < tostring(b):gsub("%d+",padnum) end)
  return o
end
2021-08-06 17:28:16