测试Map[A,B]
是否是双射的简单方法是什么,即
val m1 = Map( 1 -> "a", 2 -> "b")
val m2 = Map( 1 -> "a", 2 -> "a")
我们认为m1
与m2
不同是双射的。
答案 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