与地图的复杂交叉点

时间:2015-04-01 22:39:57

标签: dictionary set-theory

我有两张相同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}] }

有没有更好的方法来获取这些信息,而不是循环遍历整个列表并逐行检查(即使已经定义了这样做的方法,它会很棒)?

我将使用这个,以便我知道在过去几年里,唯一改变的是少数城市和少数几个州。

如果需要,很乐意进一步澄清。

提前致谢。

2 个答案:

答案 0 :(得分:1)

对于这两个地图,最好的方法是增加每个键。

但是,对于列表,如果列表已排序,请通过列表中的元素使用binary search

干杯!

答案 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

上的示例实施