Scala测试Map是双射的

时间:2016-01-13 21:19:46

标签: scala scala-collections bijection

测试Map[A,B]是否是双射的简单方法是什么,即

val m1 = Map( 1 -> "a", 2 -> "b")
val m2 = Map( 1 -> "a", 2 -> "a")

我们认为m1m2不同是双射的。

2 个答案:

答案 0 :(得分:7)

你可以做到

val m = Map(1 -> "a", 2 -> "a")
val isBijective = m.values.toSet.size == m.size

双射是一对一的。由Map定义的映射肯定是在。每个值都有一个相应的键。

如果两个键映射到相同的值,那么它不是一对一的唯一方法。但这意味着我们的价值比关键字少。

答案 1 :(得分:2)

正如here所述 -

对于X和Y之间的配对(其中Y不必与X不同)作为双射,必须有四个属性:

1)X的每个元素必须与Y
的至少一个元素配对     这是Map的固有特性。在某些情况下,它可以映射到None,它也是Y的元素之一
2)X的元素不能与Y的多个元素配对,
    地图的固有内容。

3)Y的每个元素必须与X的至少一个元素配对     Y中的每个元素都与X有一些关联,否则它将不存在。

4)Y的元素不能与X的多个元素配对     地图没有这个约束。所以我们需要检查一下。如果Y包含重复项,则会违反。

因此,足够的检查应该是“Y中没有重复”)

val a = scala.collection.mutable.Map[Int, Option[Int]]()
a(10) = None
a(20) = None
if(a.values.toArray.distinct.size != a.values.size) println("No") else println("Yes") // No

val a = Map("a"->10, "b"->20)
if(a.values.toArray.distinct.size != a.values.size) println("No") else println("Yes") // Yes

val a = scala.collection.mutable.Map[Int, Option[Int]]()
a(10) = Some(100)
a(20) = None
a(30) = Some(300)
if(a.values.toArray.distinct.size != a.values.size) println("No") else println("Yes") // Yes