我有两张相同K,V类型的地图
Key是国家
值是
的地图所以整个Map结构是
Map <String, Map<String, List<City>>> m1, m2;
现在我想知道地图的哪些条目是相同的,哪些是不同的
例如:
m1 = { India = [TA -> {City1, City2, City3} KA -> {City1, City2}]
USA = [WI -> {City1, City2, City3}, OH -> {City1, City2}] }
m2 = { India = [TA -> {City1, City2, City3} ]
USA = [WI -> {City1, City3}, DC -> {City1}] }
输出应为
Common = { India = [TA -> {City1, City2, City3} ]
USA = [WI -> {City1, City3}] }
有没有更好的方法来获取这些信息,而不是循环遍历整个列表并逐行检查(即使已经定义了这样做的方法,它会很棒)?
我将使用这个,以便我知道在过去几年里,唯一改变的是少数城市和少数几个州。
如果需要,很乐意进一步澄清。
提前致谢。
答案 0 :(得分:1)
答案 1 :(得分:1)
很大程度上取决于您将用于存储数据的集合类型。另一个因素是您将要使用的技术。然后,它还取决于您的代码的效率与可读性之间的差异程度。我最喜欢的语言是C#,所以我会选择它。然后将所有内容 - 与您的建议类似 - 实现为Dictionary<string, Dictionary<string, List<City>>>
。
要获取我使用LINQ的数据,因为它为您提供了非常易读的代码。
我在下面实现了你的例子(为了简单起见,城市是简单的字符串):
var m1 = new Dictionary<string,Dictionary<string,List<string>>>
{
{
"India", new Dictionary<string, List<string>>
{
{"TA", new List<string> {"City1", "City2", "City3"}},
{"KA", new List<string> {"City1", "City2"}}
}
},
{
"USA", new Dictionary<string, List<string>>
{
{"WI", new List<string> {"City1", "City2", "City3"}},
{"OH", new List<string> {"City1", "City2"}}
}
}
};
var m2 = new Dictionary<string,Dictionary<string,List<string>>>
{
{
"India", new Dictionary<string, List<string>>
{
{"TA", new List<string> {"City1", "City2", "City3"}},
}
},
{
"USA", new Dictionary<string, List<string>>
{
{"WI", new List<string> {"City1", "City3"}},
{"DC", new List<string> {"City1"}}
}
}
};
获取结果的操作是在嵌套集合的每个级别上应用的Intersect
方法:
var result = m1.Keys.Intersect(m2.Keys)
.ToDictionary(k => k, k => m1[k].Keys.Intersect(m2[k].Keys)
.ToDictionary(l => l, l => m1[k][l].Intersect(m2[k][l])));
如果您调试并展开result
,您会看到它返回您在示例中所需的值。
请注意,您的City
类必须实现IEquatable<T>
接口,以便可以在Intersect
方法中正确处理它。 MSDN