一般的な動作を抽出するのは簡単ではないため、そのままでは存在しないと思います
クリーンなAPIで複数のキーに一致する値を処理するには?
ただし、特定のケースでは、ここで役立つ可能性のある良い演習があります。ハッシュが使用されず、キーまたは値の取得が O(n) であるため、更新する必要があります。
しかし、アイデアは、あなたが提案したものに似たものを書けるようにすることですが、Map の代わりに Seq を使用しています...
fromKey
Implicit と trait に加えて find の助けを借りて、一種のクリーンな API ( 、 )で必要なものをエミュレートできます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"))
}