Home » Scala » Sắp xếp Collection với sorted, sortBy và sortWith

Sắp xếp Collection với sorted, sortBy và sortWith

Bài toán: Sắp xếp một Collection theo trình tự.

Giải pháp: Bạn có thể sử dụng sorted, sortBy hoặc sortWith

sorted có thể sắp xếp các kiểu Double, Float, Int hay một số kiểu ngầm định trong scala.math.Ordering


Giả sử chúng ta cần sắp xếp List các tuples:


Kết quả khi sorted:


List đã được sắp xếp theo phần tử đầu tiên của tuples. Vậy nếu muốn sắp xếp list theo phần tử thứ hai của tuples thì sẽ làm thế nào?. Ở đây chúng ta sử dụng implicit Ordering, cụ thể:


Qua câu lệnh trên bạn cũng có thể phần nào hiểu được ý nghĩa. (String,Int), là dạng của tuples, Int là giá trị để thực hiện sorted, còn (_._2) là vị trí thứ 2 của phần tử trong tuples. Để rõ hơn, bạn hãy theo dõi ví dụ sau:


Cũng có thể sử dụng sortBy, với cú pháp ngắn gọn và dễ hiểu hơn:


Quan sát có thể thấy kết quả sắp xếp khi sử dụng sorted, sortBy, sẽ theo thứ tự từ bé đến lớn. Vậy nếu muốn kết quả theo thứ tự ngược lại thì làm thế nào?
Bạn vẫn có thể sử dụng sorted, sortBy, sau đó reverse,. Tuy nhiên, ta có một cách khác, đó là sử dụng sortWith

Với sortWith, bạn có thể sắp xếp Collection, theo cách bạn muốn


Sắp xếp theo độ dài của các phần tử trong List:


Kết luận:

Nếu kiểu của sequence không được implicit Ordering, bạn không thể sắp xếp nó với sorted.
Ví dụ:


Nếu vẫn muốn sử dụng class Person, bạn phải mix Ordered, trait vào class Person


Ordered trait thực hiện các phương thức <=, , and >= , và gọi phương thức compare của bạn để so sánh chúng.

Tham khảo:

Scala Cookbook
Ordering