2010-05-12 13 views

Trả lời

56

Cấu trúc không thay đổi không chứa MultiMap, vì vậy bạn sẽ không thể sử dụng cấu trúc được chuyển đổi với cùng cú pháp thuận tiện. Nhưng nếu bạn vui lòng đối phó với các cặp khóa/giá trị, sau đó:

Nếu bạn chỉ muốn có thể thay đổi HashMap, bạn chỉ có thể sử dụng x.toMap trong 2.8 hoặc collection.immutable.Map(x.toList: _*) trong 2.7.

Nhưng nếu bạn muốn toàn bộ cấu trúc không thay đổi - bao gồm cả tập hợp cơ bản - thì bạn phải làm nhiều hơn: bạn cần phải chuyển đổi tập hợp dọc đường. Trong 2,8:

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

trong 2,7:

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

Với sự thiếu kiên nhẫn chờ đợi scala 2.8 ổn định – 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

Tôi đã ngạc nhiên một chút khi tôi thấy "mutableMap.toMap" nhưng sau đó tôi xác minh api và không tìm thấy gì giống như. http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html Vấn đề thứ hai - Đặt [B] có thể thay đổi. Đó là lý do tại sao chuyển đổi không phải là dễ dàng như vậy. – Jeriho

+3

@Jeriho: toMap được giới thiệu trong Scala2.8 – Eastsun

+0

Thx Eastsun. Xin lỗi Jeriho, tôi đã không đề cập đến nó. –

9

Bạn có thể sử dụng myMap.toMap để chuyển đổi một bản đồ có thể thay đổi vào bất biến trong Scala 2.8 và các phiên bản sau.

Nhìn vào định nghĩa của toMap từ tài liệu:

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

Bạn có thể chỉ để sau

val imm_map = MMMap.toMap