2013-07-24 27 views
7

Tất cả tôi muốn làm là chuyển đổi như sau:Chuyển đổi danh sách của Scala vào bản đồ với indicies như phím

List(2, 4, 6, 8, 10)-Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10). Nói cách khác, chỉ mục bản đồ có giá trị. Nó sẽ rất dễ dàng, nhưng tôi đang thiếu một cái gì đó.

Có ai có thể đề xuất một cách đơn giản để làm điều đó không?

UPD: Chỉ để khái quát hóa giải pháp. Giả sử tôi cần thực hiện thêm các giá trị chuyển tiếp. Ví dụ, để bọc nó với List(_). Trong trường hợp của chúng tôi:

List(2, 4, 6, 8, 10) ->Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> List(10))

+1

Tại sao không chỉ chuyển nó sang một 'IndexedSeq' (ví dụ: 'myList.toIndexedSeq')? Nó sẽ nhanh hơn và (có lẽ) nhỏ gọn hơn. –

+0

Tôi cần một bản đồ, vì tôi đang bào chế một số hoạt động bổ sung trong tính năng với các giá trị/khóa. Nhưng có, trong trường hợp nếu bạn cần truy cập ngẫu nhiên nhanh, 'IndexedSeq' sẽ là giải pháp tốt nhất. –

Trả lời

13
val xs = List(2, 4, 6, 8, 10) 
(xs.indices zip xs).toMap 
// Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10) 
+0

Chỉ tò mò: bạn có nghĩ đó là cách tiếp cận hiệu quả nhất? –

+0

@ErikAllik nếu bạn có ý nghĩa * hiệu suất *, tôi nghĩ rằng tay viết trong khi vòng lặp sẽ hiệu quả hơn nhiều trong các vòng lặp chặt chẽ, nhưng đối với các giải pháp khác tham gia ở đây (zipWithIndex dựa trên) nó sẽ hiển thị các đặc tính hiệu suất tương tự. –

15
List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap 
+0

Giá trị sản xuất này không phải là -> cặp chỉ mục, trong khi op muốn chỉ mục -> giá trị? –

+0

Vâng, đã sửa nó. [Giải pháp] của bạn (http://stackoverflow.com/a/17828495/200266) là đẹp hơn, mặc dù. – Debilski

+1

'_.swap' tốt hơn hàm inline của bạn;) – Nicolas

5

UPD: Trong trường hợp bạn muốn chuyển đổi các giá trị, bạn có thể sử dụng một trong các giải pháp mà đã được đăng và sau đó sử dụng bản đồ mapValues hoặc bạn có thể áp dụng việc chuyển đổi trước:

List(2, 4, 6, 8, 10).zipWithIndex.map { case (v, i) => i -> List(v) }.toMap 
res0: Map[Int,List[Int]] = Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> L 
ist(10)) 
Các vấn đề liên quan