Menu
CoddyTech

Phép giao của các 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 23 trên 65.

Khi cần tìm các phần tử có trong cả hai bộ sưu tập Set, phương thức (method) intersection() là giải pháp phù hợp. Thao tác này xác định các phần tử chung giữa hai tập hợp, rồi tạo một tập hợp mới chỉ chứa những phần tử có trong cả hai tập hợp ban đầu.

Phương thức intersection() so sánh các phần tử của hai tập hợp và trả về một tập hợp mới chỉ chứa các giá trị chung. Giống như các phép toán tập hợp khác, phương thức này tự động xử lý tính duy nhất, vì vậy mỗi phần tử chung chỉ xuất hiện một lần trong kết quả.

Set<String> aliceFriends = {'Bob', 'Charlie', 'Diana', 'Eve'};
Set<String> bobFriends = {'Alice', 'Charlie', 'Frank', 'Diana'};

Set<String> mutualFriends = aliceFriends.intersection(bobFriends);
print(mutualFriends);  // {Charlie, Diana}

Phép toán này đặc biệt hữu ích khi tìm các phần giao nhau trong dữ liệu, chẳng hạn như sở thích chung giữa người dùng, kỹ năng chung trong nhóm hoặc tiêu chí trùng khớp trong các thao tác lọc. Phép giao giúp bạn xác định hai tập hợp có điểm chung nào, nhờ đó hữu ích cho việc so sánh và phân tích.

challenge icon

Thử thách

Dễ

Tạo một chương trình quản lý nền tảng mạng xã hội bằng cách tìm các kết nối chung giữa hai người dùng. Chương trình của bạn cần:

  1. Đọc một chuỗi đầu vào đại diện cho tên người dùng thứ nhất
  2. Đọc nhiều chuỗi đầu vào đại diện cho các kết nối của người dùng thứ nhất (đầu vào sẽ kết thúc khi bạn nhận được "user1_done")
  3. Đọc một chuỗi đầu vào đại diện cho tên người dùng thứ hai
  4. Đọc nhiều chuỗi đầu vào đại diện cho các kết nối của người dùng thứ hai (đầu vào sẽ kết thúc khi bạn nhận được "user2_done")
  5. Tạo hai tập hợp riêng để lưu trữ các kết nối của mỗi người dùng
  6. Dùng phương thức intersection() để tìm các kết nối chung giữa hai người dùng
  7. In kết quả phân tích kết nối theo đúng định dạng bên dưới

Ví dụ, nếu người dùng thứ nhất là "Alice" với các kết nối "Bob", "Charlie", "Diana", "Eve", còn người dùng thứ hai là "Bob" với các kết nối "Alice", "Charlie", "Frank", "Diana", chương trình của bạn sẽ in ra:

User Analysis: Finding mutual connections
Alice's connections: {Bob, Charlie, Diana, Eve}
Bob's connections: {Alice, Charlie, Frank, Diana}
Mutual connections: {Charlie, Diana}
Total mutual connections: 2
Connection strength: Strong (2+ mutual connections)
Status: Users have mutual connections

Nếu người dùng thứ nhất là "Sarah" với các kết nối "John", "Mike", "Lisa", còn người dùng thứ hai là "Tom" với các kết nối "Emma", "David", "Kate", chương trình của bạn sẽ in ra:

User Analysis: Finding mutual connections
Sarah's connections: {John, Mike, Lisa}
Tom's connections: {Emma, David, Kate}
Mutual connections: {}
Total mutual connections: 0
Connection strength: None (no mutual connections)
Status: Users have no mutual connections

Nếu người dùng thứ nhất là "Emma" với các kết nối "Alex", "Jordan", "Taylor", "Morgan", còn người dùng thứ hai là "Jordan" với các kết nối "Emma", "Taylor", "Casey", chương trình của bạn sẽ in ra:

User Analysis: Finding mutual connections
Emma's connections: {Alex, Jordan, Taylor, Morgan}
Jordan's connections: {Emma, Taylor, Casey}
Mutual connections: {Taylor}
Total mutual connections: 1
Connection strength: Weak (1 mutual connection)
Status: Users have mutual connections

Chương trình của bạn phải dùng phương thức intersection() để tìm các kết nối chung giữa hai tập hợp của người dùng. Xác định mức độ kết nối dựa trên số kết nối chung: "None" khi có 0 kết nối chung, "Weak" khi có đúng 1 kết nối chung và "Strong" khi có từ 2 kết nối chung trở lên. Nếu có kết nối chung, hãy hiển thị trạng thái "Users have mutual connections", nếu không, hãy hiển thị "Users have no mutual connections".

Tự làm thử

import 'dart:io';

void main() {
  // Đọc tên người dùng thứ nhất
  String? user1Name = stdin.readLineSync();
  
  // Đọc 's connections của người dùng thứ nhất cho đến khi gặp "user1_done"
  Set<String> user1Connections = <String>{};
  String? connection;
  while ((connection = stdin.readLineSync()) != "user1_done") {
    if (connection != null) {
      user1Connections.add(connection);
    }
  }
  
  // Đọc tên người dùng thứ hai
  String? user2Name = stdin.readLineSync();
  
  // Đọc 's connections của người dùng thứ hai cho đến khi gặp "user2_done"
  Set<String> user2Connections = <String>{};
  while ((connection = stdin.readLineSync()) != "user2_done") {
    if (connection != null) {
      user2Connections.add(connection);
    }
  }
  
  // TODO: Viết code của bạn bên dưới
  // Tìm các kết nối chung bằng phương thức intersection()
  // Xác định mức độ kết nối dựa trên số lượng kết nối chung
  // Tạo đầu ra theo định dạng yêu cầu
  
  // In ra kết quả phân tích
  print("User Analysis: Finding mutual connections");
  // Thêm các câu lệnh in ra đầu ra tạ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