Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用Tcl的apply函数进行列表排序_Sorting_Tcl_Apply_Expr - Fatal编程技术网

Sorting 使用Tcl的apply函数进行列表排序

Sorting 使用Tcl的apply函数进行列表排序,sorting,tcl,apply,expr,Sorting,Tcl,Apply,Expr,假设我有如下列表: set listNums {0 -1 5 5 -5 1 10 100 -10 -10 1000} 我想用绝对值对它进行排序。我从另一个脚本中选择了下面的内容。我很难理解这一点。有人能帮我理解下面的脚本中发生了什么吗?我使用“puts”在每个阶段打印出值,但我仍然没有得到它 “a”和“b”如何更新?为什么我们需要“返回0”? 对不起,如果我问的是一些基本的问题 lsort -command {apply { {a b} { if {[expr {abs($a)

假设我有如下列表:

set listNums {0 -1 5 5 -5 1 10 100 -10 -10 1000}
我想用绝对值对它进行排序。我从另一个脚本中选择了下面的内容。我很难理解这一点。有人能帮我理解下面的脚本中发生了什么吗?我使用“puts”在每个阶段打印出值,但我仍然没有得到它

“a”和“b”如何更新?为什么我们需要“返回0”?
对不起,如果我问的是一些基本的问题

lsort -command {apply {
  {a b}
  {
    if {[expr {abs($a)] < [expr {abs($b)}]} {return -1}
    if {[expr {abs($a)] > [expr {abs($b)}]} {return 1}
    if {$a < $b} {return -1}
    if {$a > $b} {return 1}
    return 0
  }
}} $listNums
lsort-命令{apply{
{a b}
{
如果{[expr{abs($a)]<[expr{abs($b}]}{return-1}
如果{[expr{abs($a)]>[expr{abs($b)}]}{return 1}
如果{$a<$b}{return-1}
如果{$a>$b}{返回1}
返回0
}
}}$listNums

每次在排序过程中比较两个元素时,一个作为a传递到此调用,另一个作为b传递

比较的结果可以是“小于”、“大于”或“等于”,编码为返回值-1、1或0

还有,试试看

if {abs($a) < abs($b)} ... 
如果{abs($a)
相反:if的条件隐式调用expr

不要再比较了

文件: , ,

每次在排序过程中比较两个元素时,一个作为a传递到此调用,另一个作为b传递

比较的结果可以是“小于”、“大于”或“等于”,编码为返回值-1、1或0

还有,试试看

if {abs($a) < abs($b)} ... 
如果{abs($a)
相反:if的条件隐式调用expr

不要再比较了

文件: , ,

谢谢你,彼得。我仍然不清楚排序后的列表最终是如何打印出来的。如果我取列表中的前两个元素,那么a=0和b=-1。因为abs(0)tclsh myfile.tcl,则将不会有输出,除非您将其放入一个
put
。Peter,我在第一个“if”之前使用了一个“put[list$a$b]”语句,以查看$a和$b如何变化。看起来lsort正在使用mergesorting。您是否知道这是真的?如果是真的,那么我想我现在了解了整个过程。非常感谢您的帮助。也感谢您Brad提供的其他见解。@user3512999:根据文档,它确实是mergesort。谢谢您Peter。我仍然不清楚排序后的列表最终是如何打印的。如果我取列表中的前两个元素,那么a=0和b=-1。因为abs(0)tclsh myfile.tcl,则将不会有输出,除非您将其放入一个
put
。Peter,我在第一个“if”之前使用了一个“put[list$a$b]”语句,以查看$a和$b如何变化。看起来lsort正在使用mergesorting。您是否知道这是真的?如果是真的,那么我想我现在了解了整个过程。非常感谢您的帮助。还感谢您Brad提供的其他见解。@user3512999:根据文档,它确实是mergesort。