2013-02-08 263 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

,然後給出了正確答案

相關問題