2010-05-12 2 views
55
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B] 

어떻게 불변으로 변환합니까?변경 가능 맵을 불변 맵으로 변환

+0

에 나는 추측 * 새로 만들 * 수 있습니까? 그냥 추측하지만 일반적으로 일은 이런 식으로 작동합니다. –

+0

나는 무엇을 의미하는지 모르겠다. – Jeriho

+0

흠 ..'MMMap.toMap'? –

답변

56

불변의 계층 구조는 Multimap과를 포함하지 않는, 그래서 당신은 같은 편리한 구문으로 변환 구조를 사용할 수 없습니다. 그러나 키/값 세트 쌍을 처리하게되어 행복하다면

을 원할 경우 012에서 2.83으로 x.toMap을, 2.7에서 collection.immutable.Map(x.toList: _*)을 사용할 수 있습니다.

그러나 기본 구조를 포함하여 전체 구조를 변경 불가능하게하려면 - 더 많은 작업을 수행해야합니다. 따라서 세트를 변환해야합니다. 2.8 :

x.map(kv => (kv._1,kv._2.toSet)).toMap 

2.7 :

collection.immutable.Map(
    x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _* 
) 
+1

스칼라 2.8 안정을 기다리는 참을성이 없다. – Jeriho

24
scala> val mutableMap = new HashMap[Int, String] 
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map() 

scala> mutableMap += 1 -> "a" 
res5: mutableMap.type = Map((1,a)) 

scala> mutableMap 
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a)) 

scala> val immutableMap = mutableMap.toMap 
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a)) 

scala> immutableMap += 2 -> "b" 
<console>:11: error: reassignment to val 
     immutableMap += 2 -> "b" 
       ^
+0

"mutableMap.toMap"을 보았을 때 나는 놀랐지 만 API를 확인하고 닮은 것을 발견하지 못했습니다. http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html 두 번째 문제 - [B] 세트를 변경할 수 있습니다. 그래서 변환이 쉽지 않습니다. – Jeriho

+3

@Jeriho : toMap은 Scala2.8에서 도입되었습니다. – Eastsun

+0

Thx Eastsun. Jeriho, 나는 그것을 언급하지 않았다. –

9

당신은 스칼라 2.8 이상 버전에서 불변 내로 변경 가능한 맵을 변환 myMap.toMap를 사용할 수 있습니다.

문서에서 toMap의 정의를 살펴보면 :

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = { 
    val b = immutable.Map.newBuilder[T, U] 
    for (x <- self) b += x 
    b.result 
} 
2

당신은 다음과 같은

val imm_map = MMMap.toMap 
관련 문제