문제
스칼라에서 전화 groupBy()
컬렉션에서 a Map
값이 컬렉션 인 곳이지만 MultiMap
. 변환을 수행하는 가장 쉬운 방법은 무엇입니까? 새로 만들지 않아도 될까요? MultiMap
그리고 모든 것을 복사합니까?
해결책
"스칼라 특성을 혼합하기 위해 새로운 개체를 만들어야합니까?" "예"입니다. 포장 물체와 암시 적 변환으로 통증을 최소화 할 수 있습니다.
특정 문제의 경우, Groupby (...)를 강요하여 변이 가능한 맵을 변한 세트로 반환 할 수 없었습니다. 그러나 자신의 버전의 "GroupBy"를 구현하는 것은 너무 많은 코드 라인이 아닙니다.
package blevins.example
object App extends Application {
implicit def multiMapable[B](c: Iterable[B]) = new {
def groupByMM[A](f: B => A) = {
import scala.collection.mutable._
val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
for (e <- c) { ret.addBinding(f(e), e) }
ret
}
}
val c = List(1,2,3,4,5,6,7,8,9)
val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
mm.addBinding("alpha",12)
println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))
}
부록
다음은 값을 복사하지 않고 기존 맵 [String, set [int]]을 멀티 맵으로 감싸는 예입니다.
object App extends Application {
import scala.collection.mutable._
val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))
val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
val self = seed
}
multiMap.addBinding("even", 8)
println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}
종자 맵은 변동성이 필요하고 Groupby (...)가 불변의지도를 반환하기 때문에 Groupby (...)의 결과에서는 수행 할 수 없습니다.
제휴하지 않습니다 StackOverflow