2009-11-27 6 views

답변

5

"스칼라 형질에 혼합 할 새 객체를 만들어야합니까?" "예"입니다. 래핑 객체와 암시 적 변환을 통해 고통을 최소화 할 수 있습니다. 특정 문제에 대한


, 난 당신이 "Multimap과에 MapProxy"으로 포장 할 필요가 가변 세트로 변경 가능한 맵을 반환 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)) 

} 

부록 여기

[문자열, 세트 기존지도를 포장의 예입니다, 그것은 코드의 너무 많은 라인 "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 (...)는 변경 불가능한 맵을 리턴합니다.

+0

groupBy() 및 변경 가능한 콜렉션을 호출하면 변경 가능합니다. Map. –

+0

변경할지도를 반환하는 groupBy를 보여줄 수 있습니까? 여기에 표시된 것과 같은 컴파일러 오류가 발생합니다 (http://gist.github.com/245062). –

+0

내가 변경할 수있는 세트의 불변의지도를 반환합니다 같아? 그럼에도 불구하고 나는지도를 전혀 원하지 않는다. 나는 멀티 맵을 원한다. –

관련 문제