2

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

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

我们有它m1是双射的,不像m2.

4

2 回答 2

8

你可以做

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

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

它不是一对一的唯一方法是如果两个键映射到相同的值。但这意味着我们将拥有比键更少的值。

于 2016-01-13T21:30:43.527 回答
2

正如这里所解释的-

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

1) X 的每个元素必须与 Y 的至少一个元素配对
这是 Map 的固有性质。在某些情况下,它可以映射到 None ,这又是 Y 的元素之一。

2) X 的任何元素都不能与 Y 的多个元素配对,
这也是 Map 的固有网络。

3) Y 的每个元素都必须与 X 的至少一个元素配对,并且 Y 中的每个元素都会与 X 有某种关联,否则就不存在。

4) Y 的任何元素都不能与 X 的多个元素配对。
Map 没有这个约束。所以我们需要检查这个。如果 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
于 2016-01-13T22:02:46.510 回答