0Pricing
Java Academy · درس

TreeSet وNavigableSet

خزّن عناصر فريدة ومرتبة، واستخدم floor وceiling وhigher وlower للبحث عن العناصر الأقرب

TreeSet وNavigableSet درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما هي TreeSet؟

إن TreeSet مجموعة مرتبة مدعومة بـ شجرة حمراء-سوداء. تخزن عناصر فريدة بترتيبها الطبيعي التصاعدي، أو وفق مقارن مُمرَّر إليها. وتكون جميع العمليات بتعقيد O(log n).

import java.util.TreeSet;

TreeSet<String> names = new TreeSet<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
names.add("Alice"); // duplicate ignored

for (String s : names) System.out.print(s + " ");
// Alice Bob Charlie

أساليب NavigableSet: floor وceiling وlower وhigher

تطبّق TreeSet الواجهة NavigableSet، فتوفّر أساليب للتنقل والعثور على أقرب العناصر:

TreeSet<Integer> set = new TreeSet<>();
for (int i = 10; i <= 50; i += 10) set.add(i);
// {10, 20, 30, 40, 50}

System.out.println(set.floor(25));   // 20 (greatest ≤ 25)
System.out.println(set.ceiling(25)); // 30 (smallest ≥ 25)
System.out.println(set.lower(30));   // 20 (strictly less)
System.out.println(set.higher(30));  // 40 (strictly greater)

first وlast وpollFirst وpollLast

الوصول إلى العناصر الحدّية أو إزالتها:

TreeSet<String> ts = new TreeSet<>(Set.of("cherry","apple","banana","date"));

System.out.println(ts.first());       // apple
System.out.println(ts.last());        // date
System.out.println(ts.pollFirst());   // apple (removed)
System.out.println(ts.pollLast());    // date (removed)
System.out.println(ts);              // [banana, cherry]

headSet وtailSet وsubSet

استخراج عروض مجموعات فرعية مرتبة:

TreeSet<Integer> set = new TreeSet<>(Set.of(1,2,3,4,5,6,7,8,9,10));

System.out.println(set.headSet(5));      // [1, 2, 3, 4]
System.out.println(set.tailSet(7));      // [7, 8, 9, 10]
System.out.println(set.subSet(3, 7));    // [3, 4, 5, 6]

// Inclusive upper bound:
System.out.println(set.subSet(3, true, 7, true)); // [3,4,5,6,7]

التكرار التنازلي

استخدم descendingIterator() أو descendingSet() للحصول على ترتيب عكسي:

TreeSet<Integer> ts = new TreeSet<>(Set.of(1,3,5,7,9));

// Descending iterator
var it = ts.descendingIterator();
while (it.hasNext()) System.out.print(it.next() + " ");
// 9 7 5 3 1

ترتيب مخصص باستخدام Comparator

مرّر Comparator للترتيب وفق ترتيب غير طبيعي، مثل ترتيب السلاسل من الأطول إلى الأقصر:

TreeSet<String> byLength = new TreeSet<>(
    Comparator.comparingInt(String::length)
              .thenComparing(Comparator.naturalOrder())
);
byLength.add("Hi");
byLength.add("Hello");
byLength.add("Hey");
byLength.add("Java");

for (String s : byLength) System.out.print(s + " ");
// Hi Hey Java Hello

حالة استخدام: أسماء مستخدمين فريدة ومرتبة

خزّن أسماء المستخدمين في TreeSet لإزالة التكرارات تلقائيًا والحفاظ على ترتيبها الأبجدي:

TreeSet<String> users = new TreeSet<>();
users.add("alice");
users.add("bob");
users.add("alice"); // ignored
users.add("carol");

System.out.println(users.first()); // alice
System.out.println(users);         // [alice, bob, carol]

حالة استخدام: عدّ العناصر ضمن نطاق

احسب عدد العناصر ضمن نطاق باستخدام subSet:

TreeSet<Integer> scores = new TreeSet<>();
for (int s : new int[]{45,62,78,55,90,88,34,71}) scores.add(s);

// Scores between 60 and 89 (inclusive)
int count = scores.subSet(60, true, 89, true).size();
System.out.println("Students in B range: " + count); // 3 (62, 78, 88... wait: 62,78,71,88=4)
// Actually: 62,71,78,88 = 4

TreeSet مقابل HashSet مقابل LinkedHashSet

اختر بناءً على احتياجاتك:

  • HashSet: عمليات بتعقيد O(1)، وغير مرتبة
  • LinkedHashSet: عمليات بتعقيد O(1)، ومرتبة حسب ترتيب الإدراج
  • TreeSet: عمليات بتعقيد O(log n)، بترتيب مرتب، مع أساليب للتنقل

تتطلب TreeSet أن تطبّق العناصر Comparable أو أن تستخدم Comparator.

العناصر null

لا تسمح TreeSet بالعناصر null عند استخدام الترتيب الطبيعي؛ إذ يُرمى NullPointerException لأن null لا يمكن مقارنته. ويمكن استخدام مقارن مخصص يتعامل مع null صراحةً.

TreeSet<String> ts = new TreeSet<>();
try {
    ts.add(null); // throws NullPointerException
} catch (NullPointerException e) {
    System.out.println("Cannot add null: " + e);
}

أمان الخيوط

TreeSet ليست آمنة للخيوط. نفّذ المزامنة خارجيًا باستخدام Collections.synchronizedSortedSet()، أو استخدم ConcurrentSkipListSet التي تكون مرتبة وآمنة للخيوط في الوقت نفسه.

تحقق سريع

تحتوي TreeSet<Integer> على {10, 20, 30, 40, 50}. ماذا تعيد set.ceiling(35)؟

مراجعة: TreeSet وNavigableSet

أهم النقاط:

  • تخزن TreeSet عناصر فريدة ومرتبة، بتعقيد O(log n)
  • تطبّق NavigableSet التي توفّر floor وceiling وlower وhigher وfirst وlast
  • تعيد headSet وtailSet وsubSet عروض نطاق مرتبطة بالخريطة الأصلية
  • استخدم descendingSet()/descendingIterator() للترتيب العكسي
  • ليست آمنة للخيوط؛ استخدم ConcurrentSkipListSet للوصول المتزامن

الأسئلة الشائعة

هل درس «TreeSet وNavigableSet» مجاني؟

نعم — نص درس «TreeSet وNavigableSet» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «TreeSet وNavigableSet»؟

خزّن عناصر فريدة ومرتبة، واستخدم floor وceiling وhigher وlower للبحث عن العناصر الأقرب تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «TreeSet وNavigableSet»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. TreeMap: أزواج المفاتيح والقيم المرتبة
  2. الخرائط الفرعية وعروض النطاق
  3. TreeSet وNavigableSet
  4. الترتيب المخصص في مجموعات الأشجار
← العودة إلى Java Academy