Menu
CoddyTech

sorted(by:)

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 30 trên 56.

Bạn đã dùng .sorted() với các mảng chứa giá trị Comparable, chẳng hạn như số hoặc chuỗi. Khi muốn sắp xếp theo tiêu chí khác, hãy truyền vào một closure nhận hai phần tử và trả về true khi phần tử thứ nhất nên đứng trước phần tử thứ hai.

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength)              // ["hi", "hello", "banana"]

Để sắp xếp theo thứ tự giảm dần, hãy đổi phép so sánh:

let down = words.sorted { $0.count > $1.count }
print(down)                  // ["banana", "hello", "hi"]

Closure có thể so sánh bất kỳ giá trị nào được tính ra, độ dài, chữ cái cuối cùng hoặc một mục trong hash. Closure so sánh giá trị nào sẽ quyết định thứ tự sắp xếp.

min(by:) và max(by:) hoạt động giống nhau, nhưng trả về một phần tử tùy chọn duy nhất thay vì bản sao đã sắp xếp.

challenge icon

Thử thách

Trung bình

Đọc một dòng đầu vào duy nhất: một danh sách các cặp name:age, cách nhau bằng dấu phẩy.

In ra ba dòng:

  1. Tên được sắp xếp theo độ tuổi tăng dần, nối với nhau bằng ,. Nếu tuổi bằng nhau, sắp xếp tên theo thứ tự bảng chữ cái.
  2. Tên của người lớn tuổi nhất (dùng max(by:)). Nếu tuổi bằng nhau, chọn người xuất hiện trước.
  3. Tên của người trẻ tuổi nhất (dùng min(by:)). Nếu tuổi bằng nhau, chọn người xuất hiện trước.

Với đầu vào alice:30,bob:22,cara:30,dan:18, đầu ra là:

dan,bob,alice,cara
alice
dan

Tự làm thử

let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
    let parts = pair.components(separatedBy: ":")
    return (parts[0], Int(parts[1])!)
}

// TODO: sắp xếp theo tuổi tăng dần (nếu bằng tuổi thì xếp theo tên); dùng max(by:) để tìm người lớn tuổi nhất, min(by:) để tìm người nhỏ tuổi nhất
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng thực thi

Tự luyện tập: Playground Swift