我有一个名为" 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"相同的数组,而不是排序的数组。
答案 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