TCL跨步通过多暗矩阵进行循环

时间:2018-08-16 20:38:09

标签: arrays loops multidimensional-array tcl

我有一个2维TCL阵列,并寻求一种有效的方法来遍历它。该数组将缺少条目。我希望在两个嵌套的foreach循环中遍历数组,因为我必须在此过程中做一些内务处理和打印。由于缺少条目,因此我将在核心循环中使用一些info exists功能。对于第一个索引,我知道键名,并且可以将列表提供给外部循环。但是对于内部循环,除了使用array names -glob外,我别无选择,但是返回了复合索引(TCL并不真正知道多维度数组)。我正在寻找切碎此复合索引的最佳方法,就像有-stride一样有-indexlsort选项。

这是假设的无法正常工作的代码(我知道-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
  }
}

1 个答案:

答案 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吗? (随程序一起使用!)您可以像这样收集xsys

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]