6
스칼라에서 컬렉션에 groupBy()
을 호출하면 값이 컬렉션 인 Map
을 반환하지만 MultiMap
을 원합니다. 변환을하는 가장 쉬운 방법은 무엇입니까? 새 MultiMap
을 만들고 모든 것을 복사하지 않아도됩니까?스칼라 형질에 혼합하기 위해 새 객체를 만들어야합니까?
스칼라에서 컬렉션에 groupBy()
을 호출하면 값이 컬렉션 인 Map
을 반환하지만 MultiMap
을 원합니다. 변환을하는 가장 쉬운 방법은 무엇입니까? 새 MultiMap
을 만들고 모든 것을 복사하지 않아도됩니까?스칼라 형질에 혼합하기 위해 새 객체를 만들어야합니까?
"스칼라 형질에 혼합 할 새 객체를 만들어야합니까?" "예"입니다. 래핑 객체와 암시 적 변환을 통해 고통을 최소화 할 수 있습니다. 특정 문제에 대한
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))
}
부록 여기
[문자열, 세트 기존지도를 포장의 예입니다, 그것은 코드의 너무 많은 라인 "GROUPBY"당신의 자신의 버전을 구현하지 않는 것입니다 multimap에로 [지능] 값을 복사하지 않고 :이 시드 맵 b에 필요하므로 GROUPBY 결과 (...)에서 수행 될 수 없음이
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))
}
참고 e mutable 및 groupBy (...)는 변경 불가능한 맵을 리턴합니다.
groupBy() 및 변경 가능한 콜렉션을 호출하면 변경 가능합니다. Map. –
변경할지도를 반환하는 groupBy를 보여줄 수 있습니까? 여기에 표시된 것과 같은 컴파일러 오류가 발생합니다 (http://gist.github.com/245062). –
내가 변경할 수있는 세트의 불변의지도를 반환합니다 같아? 그럼에도 불구하고 나는지도를 전혀 원하지 않는다. 나는 멀티 맵을 원한다. –