2010-03-23 14 views
14

Làm cách nào để thực hiện điều đó mà không cần tạo bất kỳ bộ sưu tập mới nào? Có cái gì tốt hơn thế này không?Cách thích hợp để xóa các phần tử khỏi bản đồ có thể thay đổi được bằng cách sử dụng vị từ

val m = scala.collection.mutable.Map[String, Long]("1" -> 1, "2" -> 2, "3" -> 3, "4" -> 4) 
m.foreach(t => if (t._2 % 2 == 0) m.remove(t._1)) 
println(m) 

P.S. trong Scala 2.8

+4

Câu hỏi về các bộ sưu tập nên cho biết câu trả lời là 2,7 hoặc 2,8. –

+0

Sử dụng 2,8 trong một thời gian khá dài, đã quên khoảng 2.7. Cảm ơn, đã thêm P.S. –

+2

Có thẻ Scala-2.8 bạn có thể thêm làm dấu hiệu cho biết đây là câu hỏi cụ thể 2.8. – ams

Trả lời

18

retain thực hiện những gì bạn muốn. Trong 2.7:

val a = collection.mutable.Map(1->"one",2->"two",3->"three") 
a: scala.collection.mutable.Map[Int,java.lang.String] = 
    Map(2 -> two, 1 -> one, 3 -> three) 

scala> a.retain((k,v) => v.length < 4) 

scala> a 
res0: scala.collection.mutable.Map[Int,java.lang.String] = 
    Map(2 -> two, 1 -> one) 

Nó cũng hoạt động, nhưng tôi nghĩ vẫn còn trong thông lượng, trong 2.8.

+1

Có vẻ như giữ chân không được chấp nhận trong 2.8: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/Map .html không được dùng nữa: không thể được phỏng đoán do giữ lại trong Iterable. –

+0

Thật vậy; họ có thể phải đổi tên nó hoặc đưa ra một số cách giải quyết khác. Tôi không nghĩ nó sẽ biến mất; đó sẽ là loại ngớ ngẩn. Tôi giải thích rằng sự phản đối đó là "trong thông lượng, có thể thay đổi". –

+0

Có vẻ như việc không dùng nữa sẽ bị xóa. Vì vậy, câu trả lời là chính xác. –

0

Nếu bạn đang sử dụng một immutable.Map, trong 2,7 nó có thể có được một cái gì đó như:

def pred(k: Int, v: String) = k % 2 == 0 

m --= (m.filter(pred(_, _)).keys 

Vì không có retain phương pháp có sẵn. Rõ ràng trong trường hợp này m phải được khai báo là một var

+0

Nếu bạn đang sử dụng một Bản đồ bất biến và do đó phải tạo một bản đồ mới, nó khá dễ dàng để lọc đơn giản với sự phủ định của biến vị ngữ. –

+0

Thật vậy, điều này là đúng: nó phụ thuộc vào những gì bạn cảm thấy dễ đọc hơn trong một tình huống nhất định –

2

mỗi Scala có thể thay đổi bản đồ reference page, bạn có thể loại bỏ một yếu tố duy nhất với một trong hai - = hoặc loại bỏ, như vậy:

val m = scala.collection.mutable.Map[String, Long]("1" -> 1, "2" -> 2, "3" -> 3, "4" -> 4) 
m -= "1" // returns m 
m.remove("2") // returns Some(2) 

Sự khác biệt là - = trả về đối tượng bản đồ ban đầu, trong khi loại bỏ trả về một tùy chọn chứa giá trị tương ứng với khóa đã xóa (nếu có.)

Tất nhiên, như các câu trả lời khác cho biết, nếu bạn muốn loại bỏ nhiều phần tử dựa trên điều kiện , bạn nên xem xét lưu giữ, lọc, v.v.

Các vấn đề liên quan