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.
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:
- Đọc một chuỗi đầu vào đại diện cho tên người dùng thứ nhất
- Đọ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") - Đọc một chuỗi đầu vào đại diện cho tên người dùng thứ hai
- Đọ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") - 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
- Dùng phương thức
intersection()để tìm các kết nối chung giữa hai người dùng - 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 connectionsNế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 connectionsNế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 connectionsChươ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
}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