Скала тест Карта является биективной

Каков простой подход к тестированию 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
Другие вопросы по тегам