【问题标题】:What data-structure should I use to represent many-to-one mapping?我应该使用什么数据结构来表示多对一映射?
【发布时间】:2016-12-08 06:31:17
【问题描述】:

我有一组可以使用多个键访问的对象,我应该使用什么结构在内存中表示它?我需要的唯一操作是一个查找器,它将返回给我一个键的值。

例如:

key: {"a","aa","aaa"}, value {1}
key: {"b","bb","bbb"}, value {2}
key: {"c","cc","ccc"}, value {3}

我会这样使用它:

MyStruct.Get["a"]; // return 1
MyStruct.Get["aa"]; // return 1
MyStruct.Get["bbb"]; // return 2
MyStruct.Get["d"]; // return null

【问题讨论】:

  • 据我所知,这在类库中不存在。您可以轻松创建自己的结构。键的顺序重要吗?请记住这一点...
  • 键的顺序无所谓,有没有预建的结构?在 Java 中有 HashMap。
  • 我想你的意思是"aaa" 在第一个键中。
  • 我不确定 Dictionary 添加时是否会重复值,但似乎不会。

标签: c# data-structures


【解决方案1】:

您应该使用Dictionary。 你可以这样使用它:

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("a", 1);
myDict.Add("aa", 1);
myDict.Add("c", 3);

int result;
if (myDict.TryGetValue("a", out result)){
   //do something with result
}

或者您可以像这样进行查找:

int result1 = myDict["a"]; //throws exception when the value is not present  

在为 TKey 参数使用您自己的类时要小心。如果这样做,则应覆盖 .Equals 和 .GetHashCode 方法。

【讨论】:

  • 小心,字符串是不可变的。 "1" "1" 引用方式。你应该说清楚。对于较长的字符串,这可能是个问题。
  • 另外,Dictionary 会在您输入重复键时引发异常。值得一提。
  • @FirstStep -- 不输入重复键,只是重复值(如果你考虑到我的第一条评论,那就是)。
  • @YongkeBillYu -- 只需为引用该对象的所有键传递相同的对象。
  • 我认为还值得一提的是,当使用您自己的类型作为键时,它应该是不可变的。对键使用可变类型是可能的,但如果你不小心,会导致痛苦的世界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多