Scala 测试一个 Map 是双射的
Scala test a Map is bijective
什么是测试 Map[A,B]
是否双射的简单方法,即 for
val m1 = Map( 1 -> "a", 2 -> "b")
val m2 = Map( 1 -> "a", 2 -> "a")
我们知道 m1
与 m2
不同。
是双射的
你可以
val m = Map(1 -> "a", 2 -> "a")
val isBijective = m.values.toSet.size == m.size
一个双射是 one-to-one 和上。 Map
定义的映射肯定是onto。每个值都有对应的键。
唯一不是 one-to-one 的方法是两个键映射到相同的值。但这意味着我们的值将少于键。
正如解释的那样 here -
要使 X 和 Y 之间的配对(其中 Y 不必不同于 X)成为双射,必须满足四个属性:
1) X 的每个元素必须与 Y 的至少一个元素配对
这是 Map 的固有特性。在某些情况下,它可以映射到 None,它又是 Y 的元素之一。
2) X 的任何元素都不能与 Y 的一个以上元素配对,
又是Map的内在本质。
3) Y 的每个元素必须与 X 的至少一个元素配对,并且
Y 中的每个元素都将与 X 有某种关联,否则它将不存在。
4) Y 的任何元素都不能与 X 的一个以上元素配对。
地图没有这个约束。所以我们需要检查一下。如果 Y 包含重复项,则违反。
所以,充分检查应该是"No duplicates in 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
什么是测试 Map[A,B]
是否双射的简单方法,即 for
val m1 = Map( 1 -> "a", 2 -> "b")
val m2 = Map( 1 -> "a", 2 -> "a")
我们知道 m1
与 m2
不同。
你可以
val m = Map(1 -> "a", 2 -> "a")
val isBijective = m.values.toSet.size == m.size
一个双射是 one-to-one 和上。 Map
定义的映射肯定是onto。每个值都有对应的键。
唯一不是 one-to-one 的方法是两个键映射到相同的值。但这意味着我们的值将少于键。
正如解释的那样 here -
要使 X 和 Y 之间的配对(其中 Y 不必不同于 X)成为双射,必须满足四个属性:
1) X 的每个元素必须与 Y 的至少一个元素配对
这是 Map 的固有特性。在某些情况下,它可以映射到 None,它又是 Y 的元素之一。
2) X 的任何元素都不能与 Y 的一个以上元素配对,
又是Map的内在本质。
3) Y 的每个元素必须与 X 的至少一个元素配对,并且
Y 中的每个元素都将与 X 有某种关联,否则它将不存在。
4) Y 的任何元素都不能与 X 的一个以上元素配对。
地图没有这个约束。所以我们需要检查一下。如果 Y 包含重复项,则违反。
所以,充分检查应该是"No duplicates in 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