Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Java Program คำนวณ Union ของเซตสองเซต (Set Union)

Union ของเซต (Set Union) คืออะไร?

Union ของเซตสองเซต (A ∪ B) คือเซตที่ประกอบด้วยสมาชิกทั้งหมดที่อยู่ในเซต A หรือ เซต B (หรือทั้งคู่) โดยไม่มีค่าซ้ำ (Set ไม่อนุญาต duplicate)

ใน Java ใช้ java.util.Set interface และ implementation อย่าง HashSet ซึ่งไม่อนุญาตค่าซ้ำโดยอัตโนมัติ

อัลกอริทึม

  1. สร้างเซตแรก (Set 1) และเพิ่มสมาชิก
  2. สร้างเซตที่สอง (Set 2) และเพิ่มสมาชิก
  3. ใช้เมธอด addAll() รวมเซต 1 เข้าเซต 2
  4. เนื่องจากเป็น Set ค่าซ้ำจะถูกลบออกอัตโนมัติ

ตัวอย่างที่ 1: เขียนใน main โดยตรง

import java.util.HashSet;
import java.util.Set;

public class Demo {
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        // เซตแรก
        Set inputSet1 = new HashSet<>();
        inputSet1.add(2);
        inputSet1.add(4);
        System.out.println("The first set is defined as: " + inputSet1);
        
        // เซตที่สอง
        Set inputSet2 = new HashSet<>();
        inputSet2.add(1);
        inputSet2.add(3);
        System.out.println("The second set is defined as: " + inputSet2);
        
        // Union: เพิ่มสมาชิกของเซต 1 เข้าเซต 2
        inputSet2.addAll(inputSet1);
        
        System.out.println("\nThe union of the two sets is: \n" + inputSet2);
    }
}

ผลลัพธ์

The required packages have been imported
The first set is defined as: [2, 4]
The second set is defined as: [1, 3]
The union of the two sets is: 
[1, 2, 3, 4]

ตัวอย่างที่ 2: แยกเป็นเมธอด (Object-Oriented)

import java.util.HashSet;
import java.util.Set;

public class Demo {
    
    // เมธอดคำนวณ Union
    static void unionSets(Set set1, Set set2) {
        set2.addAll(set1);
        System.out.println("\nThe union of the two sets is: \n" + set2);
    }
    
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        Set inputSet1 = new HashSet<>();
        inputSet1.add(2);
        inputSet1.add(4);
        System.out.println("The first set is defined as: " + inputSet1);
        
        Set inputSet2 = new HashSet<>();
        inputSet2.add(1);
        inputSet2.add(3);
        System.out.println("The second set is defined as: " + inputSet2);
        
        unionSets(inputSet1, inputSet2);
    }
}

เมธอดสำคัญของ Set Interface

เมธอด คำอธิบาย
add(E e) เพิ่มสมาชิก (คืน true ถ้าเพิ่มสำเร็จ false ถ้ามีอยู่แล้ว)
addAll(Collection<? extends E> c) เพิ่มสมาชิกทั้งหมดจากคอลเลกชันอื่น (Union)
remove(Object o) ลบสมาชิกที่ระบุ
contains(Object o) ตรวจสอบว่ามีสมาชิกหรือไม่
size() จำนวนสมาชิก
isEmpty() ตรวจสอบว่าว่างหรือไม่
clear() ล้างสมาชิกทั้งหมด

Set Implementations ใน Java

Implementation ลำดับ (Order) Null allowed Thread-Safe ประสิทธิภาพ
HashSet ไม่รับประกัน (Random) ✅ 1 null ❌ O(1) - เร็วที่สุด
LinkedHashSet ✅ Insertion Order ✅ 1 null ❌ O(1) - ใกล้ HashSet
TreeSet ✅ Sorted (Natural/Comparator) ❌ ❌ O(log n)
ConcurrentSkipListSet ✅ Sorted ❌ ✅ O(log n)

Operation อื่นๆ ของ Set (Set Theory)

Set setA = new HashSet<>(Arrays.asList(1, 2, 3, 4));
Set setB = new HashSet<>(Arrays.asList(3, 4, 5, 6));

// Union (A ∪ B) - รวมทั้งคู่
Set union = new HashSet<>(setA);
union.addAll(setB); // [1, 2, 3, 4, 5, 6]

// Intersection (A ∩ B) - ซ้อนทับ
Set intersection = new HashSet<>(setA);
intersection.retainAll(setB); // [3, 4]

// Difference (A - B) - อยู่ใน A แต่ไม่อยู่ใน B
Set difference = new HashSet<>(setA);
difference.removeAll(setB); // [1, 2]

// Symmetric Difference - อยู่ในอันใดอันหนึ่งแต่ไม่ใช่ทั้งคู่
Set symDiff = new HashSet<>(setA);
symDiff.addAll(setB);
Set temp = new HashSet<>(setA);
temp.retainAll(setB);
symDiff.removeAll(temp); // [1, 2, 5, 6]

สรุป

  • ใช้ HashSet สำหรับ Union (ไม่สนใจลำดับ เร็วที่สุด)
  • ใช้ addAll() รวมเซต - ค่าซ้ำจะหายไปอัตโนมัติ
  • หากต้องการรักษาลำดับการเพิ่ม ใช้ LinkedHashSet
  • หากต้องการผลลัพธ์เรียงลำดับ ใช้ TreeSet