2013-01-03 74 views
1

嗨,我有一個基本的鍵值對的數組,我想排序它,然後拿到鑰匙。陣列的內容是這樣的:對tcl數組進行排序並獲取數組密鑰。

arrVal { 
    123adf45ad ABCD.1 
    aldfhr435d ABCD.9 
    lkh45q9er4 ABCD 
    1234dartf4 ABCD4 
} 

所以基本上我的數組鍵是某種加密的ID和值是一個字符串值。由於基於其鍵我無法排序數組我做了這樣的事情:

foreach {key in array..} { 
    lappend mylist [$arrVal($key)]; 
} 
set mylist [lsort $mylist]; 

現在排序列表中我想提取針對這些值的數組鍵。我找不到任何可以根據其值提取數組鍵的命令。任何幫助?

+0

你到底想要什麼數據?包含所有值的列表,按鍵排序? – potrzebie

+0

是的,實際上我需要鍵值按排序順序。它不是按鍵排序,而是按排序值的鍵。謝謝。 –

回答

2

基本上你幾乎就在那裏。你想要的是一個反向映射,它不是內置於語言(或者大多數語言)中的東西,而是一個概念:另一個陣列,第一個數組的值作爲第一個數組的鍵和鍵:值爲:

array set reverseMap {} 
foreach {key val} [array get arrayVal] { 
    set reverseMap($val) $key 
} 

現在你可以拿到鑰匙了這樣的:

set secondKey $reverseMap([lindex $mylist 1]) 
+0

謝謝Slebetman我記住了這一點,但我想如果有一個簡單或短的方法來做到這一點。感謝您的幫助。 :) –

+3

這種技術唯一的問題是如果這些值不是唯一的。 –

+2

你可以試試:'array set reverseMap [lreverse [array get arrayVal]]' –

0

你可以得到所有的鍵的列表中的陣列array names

set mylist [lsort [array names arrVal]] 
+0

沒關係,我不明白你的問題。 – potrzebie

1

這裏有一個一步一步的方法:

array set arrVal { 
    123adf45ad ABCD.1 
    aldfhr435d ABCD.9 
    lkh45q9er4 ABCD 
    1234dartf4 ABCD4 
} 
set arrValList [list] 
foreach {key val} [array get arrVal] {lappend arrValList [list $key $val]} 
set sortedKeys [list] 
foreach pair [lsort -index 1 $arrValList] {lappend sortedKeys [lindex $pair 0]} 
puts $sortedKeys ;# lkh45q9er4 123adf45ad aldfhr435d 1234dartf4