Обработка массива в TCL - PullRequest
1 голос
/ 16 марта 2012

у меня есть массив (хэш-карта в TCL), поэтому команда parray dn выдает следующее

                 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 Ответ

1 голос
/ 16 марта 2012

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

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 AND, вы жаждете наказания, но развлекаетесь:

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 struct :: list была команда zip, она, вероятно, была бы намного чище, поскольку вы могли бы сжать отсортированные (по ключам) значения с помощью йота 1-n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...