Union ของเซต (Set Union) คืออะไร?
Union ของเซตสองเซต (A ∪ B) คือเซตที่ประกอบด้วยสมาชิกทั้งหมดที่อยู่ในเซต A หรือ เซต B (หรือทั้งคู่) โดยไม่มีค่าซ้ำ (Set ไม่อนุญาต duplicate)
ใน Java ใช้ java.util.Set interface และ implementation อย่าง HashSet ซึ่งไม่อนุญาตค่าซ้ำโดยอัตโนมัติ
อัลกอริทึม
- สร้างเซตแรก (Set 1) และเพิ่มสมาชิก
- สร้างเซตที่สอง (Set 2) และเพิ่มสมาชิก
- ใช้เมธอด
addAll()รวมเซต 1 เข้าเซต 2 - เนื่องจากเป็น 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