문제

스칼라에서 전화 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 (...)의 결과에서는 수행 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top