TCL对整数没有意义

时间:2017-05-12 08:14:27

标签: tcl

我对lsort使用的排序算法感到困惑。我有一个列表(坐标点)说:

set a { {142 250} {142 99} }

然后,lsort -uniq $a提供输出:{142 250} {142 99}

我期待它反过来:{142 99} {142 250}

请清楚我的困惑,因为这里发生了什么?

3 个答案:

答案 0 :(得分:3)

排序是该顺序,因为根据142 250的规则,142 99小于string compare(前4个字符相同,第5个字符按此方式排序)。这是因为默认情况下lsort使用字符串比较。

您可以选择更改规则,使用-index选择列表中每个单词的哪个部分作为键(默认使用整个单词),或切换到不同的比较-dictionary-integer等规则。

set a { {142 250} {142 99} {142 -17} {142 0x1f} }
puts [lsort -integer -index 1 $a]
# ==> {142 -17} {142 0x1f} {142 99} {142 250}
set a { {142 250} {142 99} {142 -17} {142 0x1f} }
puts [lsort -dictionary $a]
# ==> {142 -17} {142 0x1f} {142 99} {142 250}

小心!在选择之前了解这些操作。 (-dictionary选项是“猜测如何为人们排序的东西”规则,如果用于其他任何事情,可能会让你感到惊讶。但它是精彩的,用于排序以向用户显示的东西。)

答案 1 :(得分:1)

如果您需要按第二个坐标对列表进行排序,则可以使用此代码

set a { {142 250} {142 99} }
lsort -integer -index 1 $a

默认情况下,TCL将全部视为字符串。因此,如果需要排序为整数,则应明确指定它。

但是如果你需要逐个按坐标排序你的点(如果X坐标相等 - 按Y排序,如果X和Y相等 - 按Z排序等等),你需要使用{{可能在-command中1}}。

lsort

答案 2 :(得分:1)

Tcl使用稳定的排序算法。如果希望坐标点列表按其x坐标排序,对于相等的x坐标按y坐标排序,则先按y坐标排序,然后按x坐标排序。

您不能以这种方式过滤掉重复的坐标点。如果这是一个要求,那么首先在整个列表上执行lsort -unique(假设坐标点都是使用相同数字基数的规范列表)。请注意,这确实会导致从列表到字符串和返回的闪烁。因此,如果您关心性能,可能需要使用其他技术删除重复项。这应该很容易,因为在排序之后,副本将是彼此相邻的。

set a { {142 250} {142 99} {83 250} }
puts [lsort -integer -index 0 [lsort -integer -index 1 $a]]
# ==> {83 250} {142 99} {142 250}