如何根据其键对tcl关联数组进行排序?

时间:2015-06-23 11:50:15

标签: arrays sorting tcl

我有一个名为" test":

的数组
key -> value
a      4
f      5
c      3
b      0
d      9

我想将数组排序为:

a 4
b 0
c 3
d 9
f 5

我尝试使用:

    set sorted_array [lsort [array names test]]

但这只会让我回答:a b c d f 如何使用值获取整个数组(根据键排序)?

我能够得到排序结果。现在我尝试将它存储为名为" sorted_array"的排序数组。使用下面给出的代码:

foreach idx [lsort [array names test]] {
    append result "$idx $test($idx)" 
    set sorted_array($idx) $test($idx) 
}

现在当我打印数组" sorted_array"使用:

foreach index [array names sorted_array] {
puts "sorted_array($index): $sorted_array($index)"
}

但是,我得到了与#34; test"相同的数组,而不是排序的数组。

1 个答案:

答案 0 :(得分:3)

stride中有lsort选项,我们可以轻松完成此操作。

  

-stride strideLength

     

如果指定了此选项,则列表将被视为由> gtideiLength元素组组成,并且组是   按第一个元素排序,或者,如果使用-index选项,   由传递给第一个索引的每个组内的元素   -index(然后由-index忽略)。元素始终保持在其组内的相同位置。列表长度必须是   strideLength的整数倍,后者必须至少为2.

array set test {
    a      4
    f      5
    c      3
    b      0
    d      9
}
puts  [lsort -stride 2 [array get test]]

<强>输出:

a 4 b 0 c 3 d 9 f 5

参考: lsort

更新 如果Tcl版本小于8.5,则必须对数组的索引进行排序并获取数组值。

array set test {
    a      4
    f      5
    c      3
    b      0
    d      9
}

foreach idx [lsort [array names test]] {
    append result "$idx $test($idx) "
}
puts $result

将根据我的第一种方法提供相同的输出。

更新2:

# Here, I have given 'lsort', because of appending the to 
# list in a sorted manner. Else, it is not required.
# i.e. If you only intend to save the values into array, 
# then we don't need 'lsort' here.
foreach idx [lsort [array names test]] {
    append result "$idx $test($idx)" 
    set sorted_array($idx) $test($idx) 
}
# lsort is mandatory for the array indices, so that while
# printing the elements, it will be in sorted form.
foreach index [lsort [array names sorted_array]] {
    puts "sorted_array($index): $sorted_array($index)"
}

作为Mr.Glenn Jackman,您也可以使用parray将排序后的数组显示为输出,而不是这样做。

parray sorted_array