flatMap
Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 29 trên 56.
flatMap dùng trong trường hợp mỗi phần tử tạo ra nhiều kết quả. Closure trả về một mảng; flatMap nối tất cả các mảng đó thành một mảng phẳng.
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Bạn cũng có thể thực hiện công việc thực sự bên trong closure. Ánh xạ từng giá trị thành một mảng nhỏ rồi làm phẳng kết quả chỉ trong một bước là trường hợp sử dụng phổ biến:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]So sánh với map: cách đó sẽ tạo ra một [[Int]], tức là một mảng gồm các mảng nhỏ, rồi bạn cần thêm một bước nữa để làm phẳng mảng. flatMap gộp hai bước đó thành một.
Thử thách
DễĐọc hai dòng đầu vào:
- Một danh sách số nguyên được phân tách bằng dấu phẩy,
nums - Một danh sách số nguyên được phân tách bằng dấu phẩy,
repeats(có cùng độ dài vớinums)
Với mỗi i, lặp lại nums[i] đúng repeats[i] lần. In ra mảng phẳng thu được, với các phần tử được nối bằng ,. Dùng flatMap.
Với đầu vào là 5,7,2 ở dòng 1 và 3,1,2 ở dòng 2, đầu ra là 5,5,5,7,2,2.
Tự làm thử
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: dùng flatMap để chuyển từng cặp (num, repeat) thành Array(repeating:count:), rồi nối các phần tử bằng ","
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
1Chuỗi chuyên sâu
Đếm và chỉ sốChữ hoa, chữ thường và xóa khoảng trắngTìm kiếm trong chuỗiTách và nối chuỗiThay thế chuỗi conÔn tập: Kiểm tra tên người dùng4Tập hợp
Tạo tập hợpPhép hợp và phép giaoPhép trừ và hiệu đối xứngTập con và tập hợp conÔn tập: Bộ lọc thẻ7Dự án: Theo dõi thói quen
Tổng quan dự ánĐánh dấu hoàn thành10Dự án: bộ máy trắc nghiệm
Tổng quan dự ánĐặt câu hỏiTự luyện tập: Playground Swift