Tcl 如何一次按多个列对矩阵进行排序

Tcl 如何一次按多个列对矩阵进行排序,tcl,Tcl,我使用包struct::matrix,并希望同时按两列或多列对矩阵进行排序。可能吗 我阅读了struct::matrix的手册页,但没有得到任何提示。最简单的方法是计算一个额外的列,该列包含组合这两个值的复合排序键,然后对该列进行排序,最后删除该列,因为基础排序方法不能保证稳定 $m add column [lmap primary [$m get column 1] secondary [$m get column 2] { # There are many ways to make

我使用包struct::matrix,并希望同时按两列或多列对矩阵进行排序。可能吗


我阅读了struct::matrix的手册页,但没有得到任何提示。

最简单的方法是计算一个额外的列,该列包含组合这两个值的复合排序键,然后对该列进行排序,最后删除该列,因为基础排序方法不能保证稳定

$m add column [lmap primary [$m get column 1] secondary [$m get column 2] {
    # There are many ways to make collation keys; here's one suitable for simple words...
    string cat $primary "," $secondary
}]
# Sort the rows by the final (new!) column
$m sort rows end
# Delete the no-longer-needed column
$m delete column end

谢谢你的回答。在很多情况下,这是可以的,但不是很优雅,它会放大矩阵的大小。我认为你必须小心使用逗号分隔符,因为它的ASCII码大于感叹号的ASCII码。对于未来,如果有人能改进struct:matrix,那就太好了。@OliverScholl我很惊讶代码没有在内部使用lsort,它使用了一种稳定的排序算法和文档,它允许您通过先对第二列排序,然后对第一列排序来进行两级排序。