2011-01-31 37 views
19

Làm cách nào để chuyển đổi một Tập ("a", "b", "c") thành Bản đồ ("a" -> 1, "b" -> 2, "c" -> 3)? Tôi nghĩ rằng nó sẽ làm việc với toMap.Scala Chuyển đổi thành Bản đồ

+2

Bạn có muốn b để lập bản đồ đến 2 vì nó là thứ hai trong Set? Hoặc bởi vì nó là chữ cái thứ hai trong bảng chữ cái? Bộ không được đặt hàng, như các áp phích khác đã chỉ ra, vì vậy đầu tiên sẽ không hoạt động. –

Trả lời

30

zipWithIndex có lẽ là những gì bạn đang tìm kiếm. Nó sẽ lấy bộ sưu tập các chữ cái của bạn và tạo một bộ sưu tập mới các bộ dữ liệu, giá trị phù hợp với vị trí trong bộ sưu tập. Tuy nhiên, bạn có thêm yêu cầu - có vẻ như vị trí của bạn bắt đầu bằng 1, thay vì 0, vì vậy bạn sẽ cần chuyển đổi các Tuples đó:

Set("a","b","c") 
    .zipWithIndex //(a,0), (b,1), (c,2) 
    .map{case(v,i) => (v, i+1)} //increment each of those indexes 
    .toMap //toMap does work for a collection of Tuples 

Một xem xét bổ sung - Bộ không giữ nguyên vị trí. Xem xét sử dụng cấu trúc như Danh sách nếu bạn muốn vị trí trên luôn hoạt động ổn định.

+0

Đó là những gì tôi muốn. Cảm ơn. –

7

toMap chỉ hoạt động nếu Set seties là cặp khóa/giá trị (ví dụ: Set (("a", 1), ("b", 2), ("c", 3))). Để có được những gì bạn muốn, sử dụng zipWithIndex:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

EDIT: hoặc (như trong bạn gốc câu hỏi :))

scala> Set("a","b","c") zip (1 to 3) toMap 

EDIT2: Duh, tôi quên toMap ở cuối!

19

Dưới đây là một giải pháp có sử dụng một Stream của tất cả các số tự nhiên bắt đầu từ 1 đến được nén với Set của bạn:

scala> Set("a", "b", "c") zip Stream.from(1) toMap 
Map((a,1), (b,2), (c,3)) 
+0

+1, đây là câu trả lời hay nhất ở đây. – missingfaktor

2

này cũng sẽ làm việc:

(('a' to 'c') zip (1 to 3)).toMap 
Các vấn đề liên quan