2011-01-25 42 views
23

Làm thế nào để sắp xếp một bản đồ của loại hình này:đồ Scala sắp xếp

"01" -> List(34,12,14,23), "11" -> List(22,11,34) 

bởi các giá trị đầu?

+0

Bạn có cần kết quả là một bản đồ khác hay bạn chỉ muốn quên các khóa khi chúng đã được sử dụng để sắp xếp? –

+0

Tôi cần kết quả trong một bản đồ khác. –

+5

tôi nghĩ rằng bản đồ được phân loại theo định nghĩa, phải không? – coubeatczech

Trả lời

57

Một cách là sử dụng scala.collection.immutable.TreeMap, mà luôn luôn được sắp xếp theo phím:

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

//If you have already a map... 
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
//... use this 
val t = TreeMap(m.toSeq:_*) 

Bạn có thể chuyển nó sang một Seq hoặc Danh sách và sắp xếp nó, quá:

//by specifying an element for sorting 
m.toSeq.sortBy(_._1) //sort by comparing keys 
m.toSeq.sortBy(_._2) //sort by comparing values 

//by providing a sort function 
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys 

Có nhiều khả năng, mỗi khả năng thuận tiện hơn trong một ngữ cảnh nhất định.

+0

Bạn cũng có thể nối thêm một chuỗi được sắp xếp tùy ý vào một 'LinkedHashMap', thứ sẽ giữ lại thứ tự chèn để truyền tải. –

+0

heh heh, chỉ cần cập nhật câu trả lời của tôi để sử dụng '.toseq: _ *', không phát hiện ra rằng bạn đã thực hiện nó! Hứa tôi không ăn cắp :) –

+0

TreeMap với toSeq rất hữu ích. –

15

Như đã trình bày, các loại mặc định Map là không được phân loại, nhưng luôn có SortedMap

import collection.immutable.SortedMap 
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

Mặc dù tôi đoán bạn không thể sử dụng, vì tôi nhận ra bài tập về nhà này và nghi ngờ rằng bản đồ của bạn là kết quả của một hoạt động groupBy. Vì vậy, bạn phải tạo một SortedMap trống và thêm các giá trị:

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted 
//or 
val sorted = SortedMap(unsorted.toSeq:_*) 

Hoặc nếu bạn không gắn bó với giao diện Map, bạn chỉ có thể chuyển nó sang một chuỗi các tuples. Lưu ý rằng phương pháp này sẽ chỉ hoạt động nếu cả khóa và giá trị đều có thứ tự được xác định. Danh sách không có thứ tự mặc định được xác định, do đó, điều này sẽ không hoạt động với mã ví dụ của bạn - do đó, tôi đã tạo một số số khác thay thế.

val unsorted = Map("01" -> 56, "11" -> 34) 
val sorted = unsorted.toSeq.sorted 

Điều này có thể hữu ích nếu bạn lần đầu tiên có thể chuyển đổi danh sách của bạn đối với một số loại khác (chẳng hạn như một String), được thực hiện tốt nhất sử dụng mapValues

update: Xem Landei của câu trả lời, trong đó cho thấy như thế nào bạn có thể cung cấp chức năng sắp xếp tùy chỉnh để làm cho phương pháp này hoạt động.