Set و HashSet

Set هي مجموعة لا تسمح بالتكرار. في هذا الدرس، سنتعلم كيفية استخدامها.

إنشاء HashSet

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

// مجموعة فارغة
Set<String> names = new HashSet<>();

// مجموعة بقيم أولية
Set<Integer> numbers = new HashSet<>(Set.of(1, 2, 3, 4, 5));

العمليات الأساسية

إضافة عناصر

JAVA
Set<String> names = new HashSet<>();
names.add("أحمد");     // true (تمت الإضافة)
names.add("محمد");     // true
names.add("أحمد");     // false (مكرر — لن تُضاف)

التحقق من الوجود

JAVA
Set<String> names = new HashSet<>(Set.of("أحمد", "محمد", "علي"));

boolean has = names.contains("محمد");  // true
boolean empty = names.isEmpty();       // false
int size = names.size();               // 3

حذف العناصر

JAVA
Set<String> names = new HashSet<>(Set.of("أحمد", "محمد", "علي"));
names.remove("محمد");           // true
names.removeIf(n -> n.startsWith("أ"));  // حذف بشرط
names.clear();                  // تفريغ

عمليات المجموعات

JAVA
Set<Integer> set1 = new HashSet<>(Set.of(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(Set.of(4, 5, 6, 7, 8));

// الاتحاد (Union)
Set<Integer> union = new HashSet<>(set1);
union.addAll(set2);  // {1, 2, 3, 4, 5, 6, 7, 8}

// التقاطع (Intersection)
Set<Integer> intersection = new HashSet<>(set1);
intersection.retainAll(set2);  // {4, 5}

// الفرق (Difference)
Set<Integer> difference = new HashSet<>(set1);
difference.removeAll(set2);  // {1, 2, 3}

المرور على المجموعة

JAVA
Set<String> names = new HashSet<>(Set.of("أحمد", "محمد", "علي"));

// for-each
for (String name : names) {
    System.out.println(name);
}

// forEach
names.forEach(name -> System.out.println(name));

TreeSet — مجموعة مرتبة

JAVA
import java.util.TreeSet;

Set<String> sortedNames = new TreeSet<>(Set.of("محمد", "أحمد", "علي"));
System.out.println(sortedNames);  // [أحمد، علي، محمد] (مرتبة أبجديًا)

// ترتيب مخصص
Set<String> customSorted = new TreeSet<>((a, b) -> b.compareTo(a));
customSorted.addAll(sortedNames);
System.out.println(customSorted);  // [محمد، علي، أحمد] (عكس الترتيب)

LinkedHashSet — مجموعة مرتبة بالإدراج

JAVA
import java.util.LinkedHashSet;

Set<String> orderedNames = new LinkedHashSet<>();
orderedNames.add("محمد");
orderedNames.add("أحمد");
orderedNames.add("علي");
System.out.println(orderedNames);  // [محمد، أحمد، علي] (ترتيب الإدراج)

مثال: إزالة التكرارات

JAVA
public static <T> List<T> removeDuplicates(List<T> list) {
    return new ArrayList<>(new LinkedHashSet<>(list));
}

List<String> names = List.of("أحمد", "محمد", "أحمد", "علي", "محمد");
List<String> unique = removeDuplicates(names);
System.out.println(unique);  // [أحمد، محمد، علي]

مثال: التحقق من Pangram

JAVA
public static boolean isPangram(String sentence) {
    Set<Character> letters = new HashSet<>();
    for (char c : sentence.toLowerCase().toCharArray()) {
        if (Character.isLetter(c)) {
            letters.add(c);
        }
    }
    return letters.size() == 26;
}

System.out.println(isPangram("The quick brown fox jumps over the lazy dog"));  // true

مقارنة بين المجموعات

الميزة HashSet TreeSet LinkedHashSet
الترتيب بدون أبجدي بالإставка
الأداء الأسرع أبطأ متوسط
null يسمح لا يسمح يسمح

❓ أسئلة شائعة

س كيف تتحقق Set من التكرار؟
ج تستخدم hashCode()>equals() للتحقق.
س لماذا TreeSet أبطأ من HashSet؟
ج لأنها تحافظ على الترتيب باستخدام شجرة ثنائية.
س هل يمكن تحويل List إلى Set؟
ج نعم، new HashSet<>(list) لإزالة التكرارات.

📖 ملخص

📝 تمارين

  1. فريد: أنشئ مجموعة من أرقام عشوائية بدون تكرار
  2. تقاطع: أوجد العناصر المشتركة بين مجموعتين
  3. Pangram: اكتب دالة تتحقق مما إذا كانت الجملة Pangram

الدرس التالي

في الدرس التالي، سنتعلم Map و HashMap — الخرائط مفتاح-قيمة.

100%