有没有办法按顺序打印数组,在[TCL]中输入条目

时间:2016-04-13 04:47:14

标签: tcl

我在Tcl中有一个数组,比如说

set count(a) b
set count(b) b
set count(c) b
set count(e) b
set count(d) b
set count(z) b
set count(m) b

当我打印这个时,我得到输出

array names count

d m e a z b c

有没有办法可以获得我编写数组的相同顺序?

3 个答案:

答案 0 :(得分:6)

使用dict代替(大多数情况相同,只是另一种语法):

dict set count a b
dict set count b b
dict set count c b
dict set count e b
dict set count d b
dict set count z b
dict set count m b

以下按插入顺序打印键

% dict keys $count
a b c e d z m

如果您想要两种方式,请分配到字典并在需要时使用

重新创建数组
array unset countArray
array set countArray $count
在Tcl 8.5中添加了

dict。虽然array从不为其元素保留插入顺序,但即使在以后的分配后,也会为dict元素保留原始广告订单。

字典和数组都实现为哈希表,并且在功能上有一些重叠。但是,数组主要是变量的容器,并允许单独跟踪元素。字典是值的容器,可以与其他类型的数据互换(dict命令集合只能使用偶数大小的正确列表。)

文档:arraydict

答案 1 :(得分:2)

基于the Tcl wiki,你无法做到

  

未订购数组键。按照设置的顺序从数组中获取值并不是直接的。一种常见的替代方法是获取名称然后对其进行排序。相反,dict中的值是有序的。

答案 2 :(得分:1)

建议在tcl8.5中使用

dict。这是你用数组做的方法:

array set foo {}
set fooOrder [list]

trace variable foo w bar

proc bar {args} {
    global fooOrder
    lappend fooOrder [lindex $args 1]
}

set foo(a) 10
set foo(c) 20
set foo(b) 30

puts "Default behaviour..."
puts [parray foo]

puts "Maintaining the order..."
foreach key $fooOrder {
    puts "foo($key) = $foo($key)"
}

输出:

sharad@ss:~$ tclsh my.tcl
Default behaviour...
foo(a) = 10
foo(b) = 30
foo(c) = 20

Maintaining the order...
foo(a) = 10
foo(c) = 20
foo(b) = 30
sharad@ss:~$