2011-08-09 35 views
23

Tôi có bản đồ mà tôi cần ánh xạ với một loại khác và kết quả cần phải là Danh sách. Tôi có hai cách (dường như) để thực hiện những gì tôi muốn, vì việc gọi bản đồ trên bản đồ dường như luôn dẫn đến một bản đồ. Giả sử tôi có một số bản đồ mà trông giống như:Chuyển đổi Bản đồ Scala thành Danh sách

val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6)) 

tôi có thể hoặc là làm:

val output = input.map{ case(k,v) => (k.getBytes, v) } toList 

Hoặc:

val output = input.foldRight(List[Pair[Array[Byte], List[Int]]]()){ (el, res) => 
    (el._1.getBytes, el._2) :: res 
} 

Trong ví dụ đầu tiên tôi chuyển đổi các loại, và sau đó gọi ToList . Tôi giả sử thời gian chạy là một cái gì đó như O(n*2) và không gian cần thiết là n*2. Trong ví dụ thứ hai, tôi chuyển đổi loại và tạo danh sách trong một lần. Tôi giả sử thời gian chạy là O(n) và khoảng trống được yêu cầu là n.

Câu hỏi của tôi là, về cơ bản là giống hệt nhau hoặc chuyển đổi thứ hai có bị cắt giảm trên bộ nhớ/thời gian/etc không? Ngoài ra, tôi có thể tìm thông tin về lưu trữ và chi phí thời gian chạy của các chuyển đổi scala khác nhau ở đâu?

Xin cảm ơn trước.

Trả lời

23

cách ưa thích của tôi để làm điều này loại điều là như thế này:

input.map { case (k,v) => (k.getBytes, v) }(collection.breakOut): List[(Array[Byte], List[Int])] 

Với cú pháp này, bạn đang đi qua để map những người xây dựng nó cần để tái tạo lại bộ sưu tập kết quả. (Thực ra, không phải nhà xây dựng, nhưng là một nhà máy xây dựng. Đọc thêm về Scala's CanBuildFrom s nếu bạn quan tâm.) collection.breakOut có thể được sử dụng chính xác khi bạn muốn thay đổi từ một loại bộ sưu tập này sang loại khác trong khi thực hiện map, flatMap, v.v. phần xấu nhất là bạn phải sử dụng chú thích kiểu đầy đủ để nó có hiệu quả (ở đây, tôi đã sử dụng một kiểu ascription sau biểu thức). Sau đó, không có bộ sưu tập trung gian nào được tạo và danh sách được xây dựng khi ánh xạ.

+3

+1. Đối với những người tìm hiểu cách thức hoạt động của 'breakOut', hãy xem câu trả lời tuyệt vời của Daniel Sobral, http://stackoverflow.com/questions/1715681/scala-2-8-breakout/1716558#1716558 –

18

Mapping qua một cái nhìn trong ví dụ đầu tiên có thể cắt giảm các yêu cầu không gian cho một bản đồ lớn:

val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList 
+0

Giới thiệu về chế độ xem lười biếng: http: // www .scala-lang.org/docu/files/collections-api/collections_42.html – Vadzim

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