Menu
CoddyTech

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.

challenge icon

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:

  1. Đọc một đầu vào chuỗi biểu thị tiêu đề khảo sát
  2. Đọ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")
  3. 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
  4. 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
  5. 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
  6. 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 successfully

Nế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 successfully

Nế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 successfully

Chươ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
}
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 điều khiển

Tự luyện tập: Trình biên dịch Dart online