Я не думаю, что он существует "из коробки", потому что общее поведение нелегко извлечь
Как обрабатывать значения, соответствующие нескольким ключам в чистом API?
Однако дляконкретные случаи здесь - хорошее упражнение, которое может помочь.Он должен быть обновлен, потому что хеш не используется, и ключ или значение получают как O (n).
Но идея состоит в том, чтобы позволить вам написать нечто похожее на то, что вы предлагаете, но используя Seq вместо Map ...
С помощью неявных и черт плюс плюс find вы можете эмулировать то, что вам нужно, с помощью своего рода чистого API (fromKey
, fromValue
).
Специфика состоит в томзначение не должно появляться в нескольких местах ... По крайней мере, в этой реализации.
trait BiMapEntry[K, V] {
def key:K
def value:V
}
trait Sem[K] {
def k:K
def <->[V](v:V):BiMapEntry[K, V] = new BiMapEntry[K, V]() { val key = k; val value = v}
}
trait BiMap[K, V] {
def fromKey(k:K):Option[V]
def fromValue(v:V):Option[K]
}
object BiMap {
implicit def fromInt(i:Int):Sem[Int] = new Sem[Int] {
def k = i
}
implicit def fromSeq[K, V](s:Seq[BiMapEntry[K, V]]) = new BiMap[K, V] {
def fromKey(k:K):Option[V] = s.find(_.key == k).map(_.value)
def fromValue(v:V):Option[K] = s.find(_.value == v).map(_.key)
}
}
object test extends App {
import BiMap._
val a = 1 <-> "a"
val s = Seq(1 <-> "a", 2 <-> "b")
println(s.fromKey(2))
println(s.fromValue("a"))
}