Cú pháp để thêm một phần tử vào scala.collection.mutable.Map là gì?


81

Cú pháp để thêm một phần tử vào scala.collection.mutable.Map là gì?

Đây là một số lần thử không thành công:

val map = scala.collection.mutable.Map

map("mykey") = "myval"

map += "mykey" -> "myval"

map.put("mykey","myval")

Một nhận xét như vậy cho thấy các hàm scala được đặt tên tệ hại như thế nào và nó phản trực giác như thế nào!
Adelin

Câu trả lời:


93

Vấn đề là dòng đầu tiên của mã của bạn không như bạn mong đợi.

Bạn nên sử dụng:

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

Sau đó, bạn có nhiều lựa chọn thay thế tương đương để thêm các mục:

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))

Và bắt đầu Scala 2.13:

scala> map.addOne("k4" -> "v4")
res5: map.type = HashMap(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4)

4
Than ôi, khi sử dụng newdấu ngoặc trống là không cần thiết.
Daniel C. Sobral 22/10/10

45

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 được hay không.

Bản đồ bất biến rất dễ xây dựng:

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

Bản đồ có thể thay đổi 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 các tham số kiểu chính xác cho cá thể Bản đồ.

Bạn cũng có thể giữ 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 bản đồ bất biến mới mỗi khi bạn thực hiện "cập nhật"

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

map += "nextkey" -> "nextval"

Nếu bạn không có bất kỳ giá trị ban đầu nào, bạn có thể sử dụng Map.empty:

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ử rằng tôi có một lớp với trường Bản đồ và nó có thể được cập nhật bất cứ lúc nào; Có thực sự ưu tiên trong Scala để có một bản đồ 'var' + 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ẽ chọn tùy chọn thứ 2, nhưng từ câu trả lời của bạn, tôi giả định rằng tùy chọn thứ nhất phổ biến hơn trong thế giới Scala?
omnomnom

1
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")
Brent Faust

18

Khi bạn nói

val map = scala.collection.mutable.Map

bạn không tạo một phiên bản bản đồ, mà thay vào đó đặt bí danh cho loại Bản đồ.

map: collection.mutable.Map.type = scala.collection.mutable.Map$@fae93e

Thay vào đó, hãy thử những cách 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))

3

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 vào bản đồ trên (và tạo một bản đồ mới, vì cả hai đều bất biến):

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

2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"

2

Tạo một bản đồ có thể thay đổi mà không có 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 các 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 khóa-giá trị hiện có:

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

Thêm khóa-giá trị mới:

scala> d(100)= "new element"

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

scala> d
res123: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, 100 -> new element, a -> ABC, 1 -> 234)

0

var map: Map [String, String] = Map ()

var map1 = map + ("red" -> "# FF0000")

println (map1)


1
Đoạn mã nhỏ bé đáng thương và cô đơn đó đang cầu xin sự đồng hành và bảo vệ bằng một lời giải thích.
Yunnosch

3
Chào mừng đến với SO. Với những câu hỏi cũ này (nó đã được hỏi cách đây hơn 10 năm), và với rất nhiều câu trả lời đã được gửi, sẽ rất hữu ích nếu chỉ ra cách câu trả lời của bạn bổ sung điều gì đó mới cho chủ đề. Do đó, bài đăng của bạn hiển thị kiểu Scala rất kém.
jwvh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.