2010-10-22 30 views

Trả lời

13

Khi bạn nói

val map = scala.collection.mutable.Map 

bạn không tạo ra một trường hợp bản đồ, nhưng thay vì răng cưa các loại bản đồ.

map: collection.mutable.Map.type = [email protected] 

Hãy thử thay vì như sau:

scala> val map = scala.collection.mutable.Map[String, Int]() 
map: scala.collection.mutable.Map[String,Int] = Map() 

scala> map("asdf") = 9 

scala> map 
res6: scala.collection.mutable.Map[String,Int] = Map((asdf,9)) 
2
var test = scala.collection.mutable.Map.empty[String, String] 
test("myKey") = "myValue" 
72

Điểm có ích là dòng đầu tiên của mã của bạn không phải là những gì bạn mong đợi. Bạn nên sử dụng

val map = scala.collection.mutable.Map[A,B]() 

hoặc

val map = new scala.collection.mutable.Map[A,B]() 

để thay thế.

scala> val map = scala.collection.mutable.Map[String,String]() 
map: scala.collection.mutable.Map[String,String] = Map() 

scala> map("k1") = "v1" 

scala> map 
res1: scala.collection.mutable.Map[String,String] = Map((k1,v1)) 

scala> map += "k2" -> "v2" 
res2: map.type = Map((k1,v1), (k2,v2)) 

scala> map.put("k3","v3") 
res3: Option[String] = None 

scala> map 
res4: scala.collection.mutable.Map[String,String] = Map((k3,v3), (k1,v1), (k2,v2)) 
+3

Than ôi, khi sử dụng 'new' dấu ngoặc đơn trống là không cần thiết. –

40

Như mọi khi, bạn nên đặt câu hỏi liệu bạn có thực sự cần một bản đồ có thể thay đổi hay không.

bản đồ Bất biến là tầm thường để xây dựng:

val map = Map(
    "mykey" -> "myval", 
    "myotherkey" -> "otherval" 
) 

bản đồ Biên Đổi là không khác gì khi lần đầu tiên được xây dựng:

val map = collection.mutable.Map(
    "mykey" -> "myval", 
    "myotherkey" -> "otherval" 
) 

map += "nextkey" -> "nextval" 

Trong cả hai trường hợp này, suy luận sẽ được sử dụng để xác định đúng loại các tham số cho cá thể Map.

Bạn cũng có thể tổ chức một bản đồ bất biến trong một var, biến sau đó sẽ được cập nhật với một trường hợp bản đồ bất biến mới mỗi khi bạn thực hiện một "cập nhật"

var map = Map(
    "mykey" -> "myval", 
    "myotherkey" -> "otherval" 
) 

map += "nextkey" -> "nextval" 

Nếu bạn không có bất kỳ ban đầu giá trị, bạn có thể sử dụng Bản đồ.trống:

val map : Map[String, String] = Map.empty //immutable 
val map = Map.empty[String,String] //immutable 
val map = collection.mutable.Map.empty[String,String] //mutable 
+2

Giả sử tôi có một lớp với trường Bản đồ và có thể cập nhật bất kỳ lúc nào; là nó thực sự ưa thích trong Scala để có một 'var' + bản đồ bất biến hơn là 'val' + bản đồ có thể thay đổi? Là một lập trình viên Java có kinh nghiệm tôi sẽ đi cho tùy chọn thứ 2, nhưng từ câu trả lời của bạn, tôi giả định rằng người đầu tiên là phổ biến hơn trong thế giới Scala? –

+0

Và nếu bạn muốn thêm nhiều mục cùng một lúc: 'map ++ Seq (" another1 "->" anotherVal1 "," another2 "->" anotherVal2 ")' –

2

Tạo một bản đồ bất biến mới:

scala> val m1 = Map("k0" -> "v0") 
m1: scala.collection.immutable.Map[String,String] = Map(k0 -> v0) 

Thêm một cặp khóa/giá trị mới cho bản đồ ở trên (và tạo ra một bản đồ mới, vì chúng tôi đều bất biến):

scala> val m2 = m1 + ("k1" -> "v1")    
m2: scala.collection.immutable.Map[String,String] = Map(k0 -> v0, k1 -> v1) 
0

Tạo một bản đồ có thể thay đổi mà không cần giá trị ban đầu:

scala> var d= collection.mutable.Map[Any, Any]() 
d: scala.collection.mutable.Map[Any,Any] = Map() 

Tạo một bản đồ có thể thay đổi với giá trị ban đầu:

scala> var d= collection.mutable.Map[Any, Any]("a"->3,1->234,2->"test") 
d: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, a -> 3, 1 -> 234) 

Cập nhật hiện có giá trị khóa:

scala> d("a")= "ABC" 

Thêm mới quan trọng có giá trị:

scala> d(100)= "new element" 

Kiểm tra bản đồ được cập nhật:

scala> d 
res123: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, 100 -> new element, a -> ABC, 1 -> 234) 
Các vấn đề liên quan