Menu
CoddyTech

Filter

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

filter nhận một closure làm vị từ và trả về một mảng mới chỉ chứa các phần tử mà closure trả về true.

let nums = [1, 2, 3, 4, 5, 6]
let evens = nums.filter { $0 % 2 == 0 }
print(evens)                 // [2, 4, 6]

Kết quả giữ nguyên thứ tự ban đầu. Kiểu dữ liệu của kết quả khớp với kiểu dữ liệu đầu vào, không có phép biến đổi nào xảy ra, chỉ có thao tác chọn.

filter kết hợp tự nhiên với map:

let big = nums
    .filter { $0 > 2 }
    .map { $0 * $0 }
print(big)                   // [9, 16, 25, 36]

Đọc từng chuỗi từ trên xuống dưới, giống như một quy trình xử lý. Mỗi bước tạo ra một mảng mới; không có gì thay đổi mảng ban đầu.

challenge icon

Thử thách

Dễ

Đọc hai dòng đầu vào:

  1. Một danh sách số nguyên, phân tách bằng dấu phẩy
  2. Một số nguyên min

In ra, mỗi nội dung trên một dòng riêng:

  1. Các số nguyên lớn hơn hẳn min, nối với nhau bằng , (hoặc để trống nếu không có số nào thỏa mãn)
  2. Bình phương của các số nguyên thỏa mãn, nối với nhau bằng ,
  3. Số lượng số nguyên thỏa mãn

Dùng filter và map theo chuỗi. Đừng lặp qua dữ liệu đầu vào hai lần.

Với dòng 1 là 1,5,2,8,3,7 và dòng 2 là 4, đầu ra là:

5,8,7
25,64,49
3

Tự làm thử

let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let min = Int(readLine()!)!

// TODO: dùng filter với điều kiện > min một lần, rồi dùng map để tính bình phương; in ra cả hai kết quả, sau đó đếm số phần 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