2013-02-08 338 views
3

INITIAL_ARRAY如何根据键值对TCL数组进行排序?

Key -> Value 
B  8 
C  10 
A  5 
E  3 
D  1 

要基于键得到一个有序数组,我用

set sorted_keys_array [lsort [array names INITIAL_ARRAY]] 

得到输出

Key -> Value 
A  5 
B  8 
C  10 
D  1 
E  3 

像明智的,如何让一个有序TCL数组基于的值为的键,如下面的输出?

Key -> Value 
C  10 
B  8 
A  5 
E  3 
D  1 

回答

10

用的Tcl 8.6开始,你可以做

lsort -stride 2 -integer [array get a] 

将产生上排序值的键/值对的名单。

之前lsort获得的-stride选项,你不得不求助于构建一个列表的列表出来的平面列表的array get返回,接着使用-index选项lsort排序是:在

set x [list] 
foreach {k v} [array get a] { 
    lappend x [list $k $v] 
} 
lsort -integer -index 1 $x 
+0

最后一行应该替换为 ** set result [lsort -integer -index 1 $ x] ** 因为“lsort”产生新列表而不是改变现有列表。 – mkostya

+0

@mkostya,我演示了这个想法,而不是一个完整的程序。此外,还有一些合理的情况是只使用一个命令的返回值而不将它分配给一个变量 - 例如,你可以在第二个例子中包装一个'proc'主体,并且该proc将返回任何'lsort'返回的结果。 – kostix

1

以前的方法这并没有为我工作,当我有一个数组:

[array get a] == D 1 E 3 A 5 B 8 C 10 

我做了以下内容,收到错误消息:

lsort -stride 2 -integer [array get a] 

expected integer but got "D"

您还需要添加一个索引:

lsort -integer -stride 2 -index 1 [array get a] 

D 1 C 10 E 3 A 5 B 8

然后你就可以改变方向:

lsort -decreasing -integer -stride 2 -index 1 [array get a] 

C 10 B 8 A 5 E 3 D 1

,然后给出了正确答案

相关问题