2010-02-03 31 views
22

Tôi có hai danh sách, một số List[A] và một số List[B]. Những gì tôi muốn là một Map[A,B] nhưng tôi muốn ngữ nghĩa của zip. Vì vậy, bắt đầu ra như vậy:Trong Scala, có cách nào để chuyển đổi hai danh sách thành Bản đồ không?

var tuplesOfAB = listOfA zip listOfB 

Bây giờ tôi không chắc chắn làm thế nào để xây dựng một Map từ tuplesOfAB tôi.

Là câu hỏi tiếp theo, tôi cũng muốn đảo ngược bản đồ của mình sao cho từ một số Map[A,B] Tôi có thể tạo Map[B,A]. Ai có thể đánh tôi bằng đầu mối không?

+1

Cảm ơn bạn đã hỏi điều này. Tôi đến đây để tìm nó. Bây giờ tôi không phải tự hỏi. – wheaties

Trả lời

26

Trong 2,8 này là thực sự đơn giản bằng cách sử dụng CanBuildFrom chức năng (as described by Daniel) và sử dụng breakOut với một loại hướng dẫn để trình biên dịch như những gì các loại quả nên là:

import scala.collection.breakOut 
val m = (listA zip listB)(breakOut): Map[A,B] 

Sau đây sẽ cũng hoạt động:

val n: Map[A,B] = (listA zip listB)(breakOut) 

Và (như EastSun, dưới đây, đã chỉ ra) điều này đã được thêm vào thư viện như toMap

val o = (listA zip listB).toMap 

Đối với đảo ngược bản đồ, bạn có thể làm:

val r = m.map(_.swap)(breakOut): Map[B, A] 
+4

val m = (listA zip listB) toMap cũng hoạt động ở scala 2.8 – Eastsun

+0

Ah! Phương pháp đó không tồn tại trong bản dựng 2.8 mà tôi có (r20327) –

+1

có, nó gần đây đã được thêm vào sau khi paulp cho thấy việc viết nó dễ dàng như thế nào, để trả lời cho một câu hỏi khác. Sau đó, ông đề nghị thêm nó vào thư viện, vì mọi bộ sưu tập chính khác đã được đại diện. –

15

Bây giờ bạn đã có danh sách các bộ dữ liệu, bạn có thể dễ dàng làm cho nó trở thành bản đồ bằng cách viết Map(tuplesOfAB: _*). Ký hiệu : _* có nghĩa là gọi quá tải varargs với các đối số được lấy từ chuỗi. Điều này có vẻ giống như một chút hài hước cú pháp, nhưng nó giúp nghĩ rằng varargs được khai báo như Map[A,B](pairs: (A,B)*): _* là một chú thích kiểu để chuyển đổi thành varargs vì phần phổ biến *.

Để đảo ngược bản đồ m sử dụng Map(m.map(_.swap): _*). Trong scala một bản đồ cũng là một tập hợp các cặp. Điều này biến đổi các cặp đó bằng cách hoán đổi các phần tử và truyền chúng tới Map constructor.

+0

Thật đẹp, cảm ơn! –

5

Còn có một cách khác để làm điều đó, ngoài những người đã được hiển thị. Tại đây:

Map() ++ tuplesOfAB 
4
scala> List("a", "f", "d") zip List(7, 5, 4, 8) toMap 
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4) 
Các vấn đề liên quan