字典可以接受重复键吗?

时间:2013-07-17 22:23:20

标签: unity3d unityscript

我有一个字典,我想按值搜索这个字典,而不是按键:-)。我想这样做,因为JS中的Dictionary没有重复键。我需要允许我的程序有重复的键,但永远不会重复值。

示例:

lp=new Dictionary.<int,int>();
lp.Add(2,5);
lp.Add(5,0);
lp.Add(1,3);
lp.Add(2,6);// duplicate key and error

切换值和键后:

lp=new Dictionary.<int,int>();
lp.Add(5,2);
lp.Add(0,5);
lp.Add(3,1);
lp.Add(6,2);

现在我想按值查找键,因为我在此结果中有值。

Code可以接受Javascript中的重复键吗?

1 个答案:

答案 0 :(得分:1)

为什么不使用列表字典?:

#pragma strict
import System.Collections.Generic;
var map = new Dictionary.<int,List.<int> >();

function Start () {
    Add(2,1);
    Add(2,2);
    Add(2,3);
    Add(3,0);
    for(var kvp in map){
        for(var v in kvp.Value){
            Debug.Log("Key: "+kvp.Key + "Value: " +v);
        }
    }
}

function Add(key:int,value:int){
    if (!map.ContainsKey(key) ){
        map[key] = new List.<int>();
    }
    map[key].Add(value);
}

<强>更新

轻微修改以避免重复值:

var map = new Dictionary.<int,HashSet.<int> >();
function Add(key:int,value:int){
    if (!map.ContainsKey(key) ){
        map[key] = new HashSet.<int>();
    }
    if (map[key].Contains(value))return;
    map[key].Add(value);
}

这些只是C#集合的包装器,因此对字典进行排序只是:

function SortedKeys(){
    var keys = new List.<int>(map.Keys);
    keys.Sort();
    return keys;
}

列表sort是O(nlgn)平均情况。