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) لإزالة التكرارات.📖 ملخص
- Set: مجموعة فريدة بدون تكرار
- HashSet: الأسرع، بدون ترتيب
- TreeSet: مرتبة أبجديًا
- LinkedHashSet: مرتبة بالإставка
- العمليات: add، remove، contains، size
- عمليات المجموعات: union، intersection، difference
📝 تمارين
- فريد: أنشئ مجموعة من أرقام عشوائية بدون تكرار
- تقاطع: أوجد العناصر المشتركة بين مجموعتين
- Pangram: اكتب دالة تتحقق مما إذا كانت الجملة Pangram
الدرس التالي
في الدرس التالي، سنتعلم Map و HashMap — الخرائط مفتاح-قيمة.



