2012-03-16 2 views
1

массив У ​​меня есть массив (HashMap в TCL), поэтому команда PArray дп дает следующуюобработки в TCL

    dn(1) = 52638515 
       dn(11) = 324009 
       dn(12) = 257949 
       dn(13) = 298844 
       dn(14) = 442499 
       dn(15) = 417333 
       dn(2) = 49807360 
       dn(3) = 52848230 
       dn(4) = 39845888 
       dn(5) = 26633830 

так я хочу, чтобы установить его в другой массив, который начинается с 1 по длине (dn) .. У меня есть несколько записей в dn, как данные выше с отсутствующими индексами между ними. Есть ли встроенные команды массивов в tcl, которые это делают ???

ответ

1

Я не могу думать о автоматической команды, но вы могли бы сделать что-то вроде следующего:

set result {} 
set index 0 
foreach key [lsort -integer [array keys dn]] { 
    lappend result [incr index] $db($key) 
} 
array set newDn $result 

Или, если у вас есть 8.6 и tcllib И вы мазохист, но развлечения:

set index 0 
array set newDn [struct::list flatten \ 
        [::struct::list mapfor x \ 
         [dict values [lsort -stride 2 -integer [array get dn]]] \ 
         {list [incr index] $x}]] 

Хотя я бы утверждать, что первая версия несколько проще следовать :)

Если tcllib структура :: список была команда зип, вероятно, было бы намного чище, так как у ou может zip отсортированные (по ключам) значения с iota 1-n.