Tìm phần tử bằng 'firstWhere'
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 15 trên 65.
Khi cần tìm một phần tử cụ thể trong danh sách đáp ứng một số tiêu chí nhất định, phương thức firstWhere() mang đến một giải pháp hiệu quả. Khác với các phương thức lọc trả về tất cả phần tử phù hợp, firstWhere() sẽ dừng tìm kiếm ngay khi tìm thấy phần tử đầu tiên thỏa mãn điều kiện của bạn.
Phương thức firstWhere() nhận một hàm kiểm tra, hàm này trả về true hoặc false cho mỗi phần tử. Phương thức kiểm tra lần lượt từng phần tử cho đến khi tìm thấy phần tử đầu tiên đạt yêu cầu, rồi trả về phần tử đó ngay lập tức.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Tìm số chẵn đầu tiên
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Trong trường hợp không có phần tử nào thỏa mãn điều kiện, firstWhere() có tham số tùy chọn orElse. Tham số này nhận một hàm (function) trả về giá trị mặc định khi không tìm thấy kết quả phù hợp, giúp chương trình không bị lỗi.
Thử thách
DễTạo một chương trình quản lý hệ thống dịch vụ khách hàng bằng cách tìm khiếu nại đầu tiên của khách hàng cần được xử lý ngay. Chương trình của bạn cần:
- Đọc một chuỗi đầu vào biểu thị tên phòng ban
- Đọc nhiều giá trị đầu vào kiểu số nguyên biểu thị mức độ ưu tiên của khiếu nại (đầu vào kết thúc khi bạn nhận được
-1) - Đọc một giá trị đầu vào kiểu số nguyên biểu thị ngưỡng ưu tiên khẩn cấp
- Dùng phương thức
firstWhere()để tìm khiếu nại đầu tiên có mức độ ưu tiên lớn hơn hoặc bằng ngưỡng khẩn cấp - In kết quả dịch vụ khách hàng theo đúng định dạng bên dưới
Ví dụ, nếu tên phòng ban là "Technical Support", các mức độ ưu tiên lần lượt là 3, 7, 2, 9, 4, và ngưỡng khẩn cấp là 8, chương trình của bạn sẽ in ra:
Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action requiredNếu tên phòng ban là "Billing Department", các mức độ ưu tiên lần lượt là 4, 6, 3, 5, và ngưỡng khẩn cấp là 7, chương trình của bạn sẽ in ra:
Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processingNếu tên phòng ban là "Sales Support", các mức độ ưu tiên lần lượt là 10, 2, 8, và ngưỡng khẩn cấp là 9, chương trình của bạn sẽ in ra:
Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action requiredChương trình của bạn phải dùng phương thức firstWhere() để tìm mức độ ưu tiên của khiếu nại đầu tiên lớn hơn hoặc bằng ngưỡng khẩn cấp. Nếu không tìm thấy khiếu nại khẩn cấp nào, hãy hiển thị "Not found" cho khiếu nại khẩn cấp đầu tiên và hiển thị "No urgent complaints - continue normal processing" làm trạng thái. Nếu tìm thấy khiếu nại khẩn cấp, hãy hiển thị mức độ ưu tiên và hiển thị "Urgent complaint found - immediate action required" làm trạng thái.
Tự làm thử
import 'dart:io';
void main() {
// Đọc tên bộ phận
String? department = stdin.readLineSync();
// Đọc các mức độ ưu tiên của khiếu nại cho đến khi gặp -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// Đọc ngưỡng khẩn cấp
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: Viết code của bạn bên dưới
// Dùng phương thức firstWhere() để tìm khiếu nại đầu tiên có mức độ ưu tiên >= urgentThreshold
// In ra kết quả
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// In ra kết quả khiếu nại khẩn cấp đầu tiên
// In ra thông báo trạng thái
}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 điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online