2013-01-03 76 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