Скала тест Карта является биективной
Каков простой подход к тестированию Map[A,B]
является биективным, а именно для
val m1 = Map( 1 -> "a", 2 -> "b")
val m2 = Map( 1 -> "a", 2 -> "a")
у нас есть это m1
биективно в отличие m2
,
2 ответа
Вы могли бы сделать
val m = Map(1 -> "a", 2 -> "a")
val isBijective = m.values.toSet.size == m.size
Биекция является взаимно-однозначной. Отображение определяется Map
определенно на. Каждое значение имеет соответствующий ключ.
Единственный способ, которым это не один к одному - это если два ключа отображаются на одно и то же значение. Но это означает, что у нас будет меньше значений, чем ключей.
Как объяснено здесь -
Чтобы спаривание между X и Y (где Y не должно отличаться от X) было биекцией, должно быть четыре свойства:
1) каждый элемент X должен быть связан как минимум с одним элементом Y
Это неотъемлемая природа карты. В некоторых случаях он может быть сопоставлен с 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