Chuyển danh sách thành tập hợp
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 21 trên 65.
Một trong những ứng dụng thiết thực nhất của Set là loại bỏ các phần tử trùng lặp khỏi List. Vì tập hợp tự động loại bỏ phần tử trùng lặp, bạn có thể dễ dàng chuyển danh sách có các giá trị lặp lại thành một tập hợp chỉ gồm các phần tử duy nhất.
Để chuyển một List thành Set, bạn chỉ cần truyền danh sách vào hàm khởi tạo Set.from(). Thao tác này tạo một tập hợp mới chứa tất cả phần tử duy nhất từ danh sách ban đầu.
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}Nếu cần nhận lại kết quả dưới dạng List (có thể để duy trì khả năng tương thích với các phần khác trong code), bạn có thể chuyển tập hợp về danh sách bằng cách dùng toList(). Cách này tạo ra một danh sách chỉ chứa các phần tử duy nhất từ danh sách ban đầu.
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]Mẫu Danh sách → Tập hợp → Danh sách này rất phổ biến khi bạn cần làm sạch dữ liệu bằng cách loại bỏ các phần tử trùng lặp mà vẫn giữ cấu trúc danh sách để xử lý tiếp.
Thử thách
DễTạo một chương trình quản lý hệ thống làm sạch dữ liệu bằng cách loại bỏ các mục trùng lặp trong câu trả lời khảo sát. Chương trình của bạn cần:
- Đọc một đầu vào chuỗi biểu thị tiêu đề khảo sát
- Đọc nhiều đầu vào chuỗi biểu thị câu trả lời khảo sát (đầu vào sẽ kết thúc khi bạn nhận được
"responses_done") - Tạo một List để lưu tất cả câu trả lời ban đầu, bao gồm cả các mục trùng lặp
- Dùng
Set.from()để chuyển danh sách thành một Set, tự động loại bỏ các mục trùng lặp - Dùng
toList()để chuyển Set trở lại thành một List gồm các câu trả lời duy nhất - In kết quả làm sạch dữ liệu theo đúng định dạng bên dưới
Ví dụ: nếu tiêu đề khảo sát là "Customer Satisfaction Survey" và các câu trả lời là "Excellent", "Good", "Excellent", "Fair", "Good", "Excellent", "Poor", chương trình của bạn sẽ in ra:
Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfullyNếu tiêu đề khảo sát là "Product Feedback" và các câu trả lời là "Like", "Dislike", "Like", "Like", chương trình của bạn sẽ in ra:
Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfullyNếu tiêu đề khảo sát là "Event Rating" và các câu trả lời là "Amazing", "Okay", "Great", chương trình của bạn sẽ in ra:
Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfullyChương trình của bạn phải thể hiện đầy đủ quy trình List → Set → List. Trước tiên, lưu tất cả câu trả lời vào một List, sau đó dùng Set.from() để tạo một Set từ List, cuối cùng dùng toList() để chuyển Set trở lại thành một List. Tính số mục trùng lặp đã loại bỏ bằng cách lấy tổng số mục ban đầu trừ đi số mục duy nhất cuối cùng.
Tự làm thử
import 'dart:io';
void main() {
// Đọc tiêu đề khảo sát
String? surveyTitle = stdin.readLineSync();
// Đọc các câu trả lời khảo sát cho đến khi gặp "responses_done"
List<String> originalResponses = [];
String? response;
while ((response = stdin.readLineSync()) != "responses_done") {
if (response != null) {
originalResponses.add(response);
}
}
// TODO: Viết code của bạn bên dưới
// 1. Dùng Set.from() để chuyển danh sách thành tập hợp (loại bỏ các mục trùng lặp)
// 2. Dùng toList() để chuyển tập hợp trở lại thành danh sách
// 3. Tính số mục trùng lặp đã loại bỏ và số lượng cuối cùng
// In kết quả theo định dạng yêu cầu
print("Survey: $surveyTitle");
print("Original responses: $originalResponses");
// Thêm các câu lệnh in ra còn lại ở đây
}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