private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Làm cách nào để chuyển đổi thành không thay đổi?Chuyển đổi bản đồ có thể biến đổi thành bản đồ không thể thay đổi
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Làm cách nào để chuyển đổi thành không thay đổi?Chuyển đổi bản đồ có thể biến đổi thành bản đồ không thể thay đổi
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: _*
)
Với sự thiếu kiên nhẫn chờ đợi scala 2.8 ổn định – Jeriho
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"
^
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
@Jeriho: toMap được giới thiệu trong Scala2.8 – Eastsun
Thx Eastsun. Xin lỗi Jeriho, tôi đã không đề cập đến nó. –
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
}
Bạn có thể chỉ để sau
val imm_map = MMMap.toMap
I * Đoán * bạn tạo một hình mới? Chỉ cần đoán, nhưng thường thì mọi thứ hoạt động theo cách này. –
Tôi không chắc chắn ý của bạn là gì – Jeriho
hmm .. 'MMMap.toMap'? –