对tcl数组进行排序并获取数组键。

时间:2013-01-03 17:11:11

标签: arrays tcl sorting

嗨我有一个基本键值对的数组,我想对它进行排序然后获取键。数组内容如下:

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

所以基本上我的数组键是某种加密的id,值是字符串值。由于我无法根据其键对数组进行排序,我做了类似的事情:

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

现在对于排序列表我想根据这些值提取数组键。我找不到任何可以根据其值提取数组键的命令。有帮助吗?

3 个答案:

答案 0 :(得分:3)

基本上你几乎就在那里。你想要的是一个反向映射,它不是内置于语言(或实际上是大多数语言)中的东西,而是一个概念:另一个数组,第一个数组的值作为第一个数组的键和键作为值:

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

现在你可以得到这样的键:

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

答案 1 :(得分: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

答案 2 :(得分:0)

您可以使用array names获取数组中所有键的列表。

set mylist [lsort [array names arrVal]]