我在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
有没有办法可以获得我编写数组的相同顺序?
答案 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
命令集合只能使用偶数大小的正确列表。)
答案 1 :(得分:2)
基于the Tcl wiki,你无法做到
未订购数组键。按照设置的顺序从数组中获取值并不是直接的。一种常见的替代方法是获取名称然后对其进行排序。相反,dict中的值是有序的。
答案 2 :(得分:1)
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:~$