在Scala中,如何检查Map是否包含来自另一个Map的所有条目?

时间:2014-08-07 18:05:32

标签: scala map scala-collections

总有问题。说我有2张地图

val map1 = Map("ram"->"2gb", "size"->"15", "color"->"red", "fruit"->"strawberry")
val map2 = Map("ram"->"2gb", "size"->"15", "color"->"red")

我想知道map1 完全是否包含map2(map1中的额外键/值是可以的),Scala的好方法是什么?

我能想到的最好的就是创造自己的功能:

def doesMapContainMap(map1: Map[_,_], map2: Map[_,_]): Boolean = {
  var matchCount: Int = 0
  map2 foreach {
    entry => {
      if (map1.exists(x => x._1 == entry._1 && x._2 == entry._2)) {
        matchCount += 1;
      }
    }
  }
  // true if the number of matches is equal to the number of elements in map2
  map2.size == matchCount
}

这是有效的(我认为),但我想知道是否有更好的东西。

2 个答案:

答案 0 :(得分:20)

您可以将Map转换为Set,然后应用subsetOf方法。

val map1 = Map("ram"->"2gb", "size"->"15", "color"->"red", "fruit"->"strawberry")
val map2 = Map("ram"->"2gb", "size"->"15", "color"->"red")

map2.toSet subsetOf map1.toSet // res0: Boolean = true

答案 1 :(得分:6)

如果您不想复制收藏品,

map2.forall{ case (k,v) => map1.get(k).exists(_ == v) }

通过查找map2中的密钥,返回一个选项,并检查该值是否存在以及它应该是什么来检查map1中的所有内容。