Menu
CoddyTech

Toán học: phép giao của HashSet

Thuộc phần Logic và luồng chương trình trong hành trình C# của Coddy. Bài học 63 trên 66.

Phần giao của hai tập hợp chỉ chứa các phần tử xuất hiện trong cả hai tập hợp.

Tạo hai HashSet:

HashSet<int> set1 = new HashSet<int>() { 1, 2, 3, 4, 5 };
HashSet<int> set2 = new HashSet<int>() { 3, 4, 5, 6, 7 };

Để tìm phần giao, hãy dùng phương thức IntersectWith:

set1.IntersectWith(set2);

Sau khi chạy đoạn code này, set1 sẽ chứa:

{ 3, 4, 5 }

Phương thức IntersectWith sửa đổi tập hợp được gọi, chỉ giữ lại các phần tử có trong cả hai tập hợp.

Để tạo một tập hợp mới chứa phần giao mà không sửa đổi các tập hợp ban đầu, bạn có thể:

HashSet<int> intersection = new HashSet<int>(set1);
intersection.IntersectWith(set2);
challenge icon

Thử thách

Trung bình

Tạo một phương thức (method) có tên FindCommonElements nhận hai đối số:

  • Một HashSet gồm các số nguyên (set1)
  • Một HashSet gồm các số nguyên (set2)

Phương thức này sẽ trả về một HashSet mới chỉ chứa các phần tử xuất hiện trong cả hai tập hợp (phép giao).

Tự làm thử

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

class Program {
    public static HashSet<int> FindCommonElements(HashSet<int> set1, HashSet<int> set2) {
        // Viết code của bạn ở đây
        return null;
    }
    
    static void Main(string[] args) {
        // Đọc dòng đầu tiên cho tập hợp thứ nhất
        string line1 = Console.ReadLine();
        HashSet<int> set1 = new HashSet<int>();
        
        // Kiểm tra xem tập hợp thứ nhất có ở định dạng mảng JSON không
        if (line1 != null && line1.StartsWith("[") && line1.EndsWith("]")) {
            try {
                // Trích xuất nội dung giữa hai dấu ngoặc vuông
                string arrayContent = line1.Substring(1, line1.Length - 2);
                
                // Thử phân tích nội dung mảng JSON
                string[] values = Regex.Split(arrayContent, @",\s*");
                foreach (string value in values) {
                    // Xóa dấu ngoặc kép nếu có
                    string cleanValue = value.Trim();
                    if (cleanValue.StartsWith("\"") && cleanValue.EndsWith("\"")) {
                        cleanValue = cleanValue.Substring(1, cleanValue.Length - 2);
                    }
                    
                    // Chuyển thành số nguyên rồi thêm vào tập hợp
                    if (int.TryParse(cleanValue, out int num)) {
                        set1.Add(num);
                    }
                }
            }
            catch (Exception ex) {
                Console.WriteLine($"Error parsing first set: {ex.Message}");
                return;
            }
        }
        else {
            // Xử lý đầu vào phân tách bằng dấu cách cho tập hợp thứ nhất
            string[] input1 = line1.Split();
            foreach (string s in input1) {
                if (int.TryParse(s, out int num)) {
                    set1.Add(num);
                }
            }
        }
        
        // Đọc dòng thứ hai cho tập hợp thứ hai
        string line2 = Console.ReadLine();
        HashSet<int> set2 = new HashSet<int>();
        
        // Kiểm tra xem tập hợp thứ hai có ở định dạng mảng JSON không
        if (line2 != null && line2.StartsWith("[") && line2.EndsWith("]")) {
            try {
                // Trích xuất nội dung giữa hai dấu ngoặc vuông
                string arrayContent = line2.Substring(1, line2.Length - 2);
                
                // Thử phân tích nội dung mảng JSON
                string[] values = Regex.Split(arrayContent, @",\s*");
                foreach (string value in values) {
                    // Xóa dấu ngoặc kép nếu có
                    string cleanValue = value.Trim();
                    if (cleanValue.StartsWith("\"") && cleanValue.EndsWith("\"")) {
                        cleanValue = cleanValue.Substring(1, cleanValue.Length - 2);
                    }
                    
                    // Chuyển thành số nguyên rồi thêm vào tập hợp
                    if (int.TryParse(cleanValue, out int num)) {
                        set2.Add(num);
                    }
                }
            }
            catch (Exception ex) {
                Console.WriteLine($"Error parsing second set: {ex.Message}");
                return;
            }
        }
        else {
            // Xử lý đầu vào phân tách bằng dấu cách cho tập hợp thứ hai
            string[] input2 = line2.Split();
            foreach (string s in input2) {
                if (int.TryParse(s, out int num)) {
                    set2.Add(num);
                }
            }
        }
        
        // Tìm các phần tử chung
        HashSet<int> common = FindCommonElements(set1, set2);
        
        // In kết quả (đã sắp xếp)
        Console.WriteLine(string.Join(" ", common.OrderBy(x => x)));
    }
}
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 chương trình

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