我有一个2维TCL阵列,并寻求一种有效的方法来遍历它。该数组将缺少条目。我希望在两个嵌套的foreach
循环中遍历数组,因为我必须在此过程中做一些内务处理和打印。由于缺少条目,因此我将在核心循环中使用一些info exists
功能。对于第一个索引,我知道键名,并且可以将列表提供给外部循环。但是对于内部循环,除了使用array names -glob
外,我别无选择,但是返回了复合索引(TCL并不真正知道多维度数组)。我正在寻找切碎此复合索引的最佳方法,就像有-stride
一样有-index
或lsort
选项。
这是假设的无法正常工作的代码(我知道-index
没有array namees
选项)表达了我想做的事情。
array set ar { x1,y1 v11 x1,y2 v12 x1,y3 v13
x2,y1 v21 x2,y3 v13
x3,y1 v31 x3,y2 v32 x3,y3 v33
x4,y1 v41 x4,y2 v42 x4,y3 v43 }
foreach x { x1 x2 x3 x4 } {
foreach y [ array names ar -glob ${x}* -index 1 ] {
puts $y
}
}
预期产量
y1
y2
y3
y1 \
y3 / => Note missing entry
y1
y2
y3
y1
y2
y3
感谢您的反馈。
更新:
使用split
查看投标是可以的。我想知道我是否错过了array names
的选项,或者也许可以通过foreach
来做一些事情来使它更加流畅。
我可以提出自己的使用split
的解决方案。
foreach x { x1 x2 x3 x4 } {
foreach yy [ array names ar -glob ${x}* ] {
set y [ lindex [ split $yy , ] 1 ]
puts $y
}
}
答案 0 :(得分:0)
好吧,您可以轻松获得主键和辅助键的列表:
# You might choose different sorting rules…
set xs [lsort -unique [lmap xy [array names ar] {
lindex [split $xy ","] 0
}]]
set ys [lsort -unique [lmap xy [array names ar] {
lindex [split $xy ","] 1
}]]
然后,您可以使用foreach
处理稀疏性,使用嵌套的info exists
循环轻松地迭代这些循环:
foreach x $xs {
foreach y $ys {
if {[info exists ar($x,$y)]} {
...
...
}
}
}
还不是8.6吗? (随程序一起使用!)您可以像这样收集xs
和ys
:
set xs {}
set ys {}
foreach xy [array names ar] {
lassign [split $xy ","] x y
lappend xs $x
lappend ys $y
}
set xs [lsort -unique $xs]
set ys [lsort -unique $ys]