0Pricing
Java Academy · درس

TreeMap: أزواج المفاتيح والقيم المرتبة

استخدم TreeMap للحفاظ على الترتيب، والتنقل باستخدام firstKey وlastKey وfloorKey وceilingKey

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

ما هي TreeMap؟

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

import java.util.TreeMap;

TreeMap<String, Integer> scores = new TreeMap<>();
scores.put("Charlie", 85);
scores.put("Alice", 92);
scores.put("Bob", 78);

// Iteration is in key order: Alice, Bob, Charlie
for (var entry : scores.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

firstKey وlastKey وfloorKey وceilingKey

توفّر واجهة NavigableMap في TreeMap أساليب للتنقل والعثور على مفاتيح بالنسبة إلى قيمة معينة:

TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "ten"); map.put(20, "twenty"); map.put(30, "thirty"); map.put(40, "forty");

System.out.println(map.firstKey());       // 10
System.out.println(map.lastKey());        // 40
System.out.println(map.floorKey(25));     // 20 (largest key ≤ 25)
System.out.println(map.ceilingKey(25));   // 30 (smallest key ≥ 25)
System.out.println(map.lowerKey(20));     // 10 (strictly less)
System.out.println(map.higherKey(20));    // 30 (strictly greater)

التنقل بين الإدخالات

تعيد floorEntry وceilingEntry وfirstEntry وlastEntry كائن Map.Entry كاملًا بدلًا من المفتاح وحده:

TreeMap<Integer, String> prices = new TreeMap<>();
prices.put(100, "Budget"); prices.put(300, "Standard"); prices.put(700, "Premium");

var entry = prices.floorEntry(350);
System.out.println(entry.getKey() + ": " + entry.getValue()); // 300: Standard

var top = prices.lastEntry();
System.out.println(top.getValue()); // Premium

subMap وheadMap وtailMap

استخرج عروض نطاق من TreeMap. تكون هذه العروض مرتبطة بالخريطة الأصلية، ولذلك تنعكس التغييرات في أحدها على الآخر.

TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i, "v"+i);

// Keys from 3 (inclusive) to 7 (exclusive)
System.out.println(map.subMap(3, 7));   // {3=v3, 4=v4, 5=v5, 6=v6}

// Keys strictly less than 5
System.out.println(map.headMap(5));     // {1=v1, 2=v2, 3=v3, 4=v4}

// Keys >= 7
System.out.println(map.tailMap(7));     // {7=v7, 8=v8, 9=v9, 10=v10}

الحدود الشاملة والحصرية

استخدم النسخ المحمّلة بشكل زائد للتحكم الدقيق في الحدود:

TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i*10, "v"+i);

// From 30 (inclusive) to 60 (inclusive)
System.out.println(map.subMap(30, true, 60, true));
// {30=v3, 40=v4, 50=v5, 60=v6}

الترتيب التنازلي

استخدم descendingMap() أو descendingKeySet() لتكرار المفاتيح بترتيب عكسي:

TreeMap<String, Integer> tm = new TreeMap<>();
tm.put("A", 1); tm.put("C", 3); tm.put("B", 2);

for (String key : tm.descendingKeySet()) {
    System.out.print(key + " "); // C B A
}

pollFirstEntry وpollLastEntry

أزل الإدخال الأول أو الأخير وأعده ذريًا؛ وهذا مفيد لإنشاء خرائط الأولوية:

TreeMap<Integer, String> events = new TreeMap<>();
events.put(8, "Breakfast");
events.put(12, "Lunch");
events.put(18, "Dinner");

var first = events.pollFirstEntry(); // removes 8=Breakfast
System.out.println(first.getValue() + " removed");
System.out.println(events.firstKey()); // 12

حالة استخدام: لوحة المتصدرين

تحتاج لوحة المتصدرين إلى ترتيب اللاعبين حسب النقاط. ترتب TreeMap المفاتيح تلقائيًا:

TreeMap<Integer, String> leaderboard = new TreeMap<>(Comparator.reverseOrder());
leaderboard.put(1200, "Alice");
leaderboard.put(1500, "Bob");
leaderboard.put(900, "Carol");

int rank = 1;
for (var e : leaderboard.entrySet()) {
    System.out.println(rank++ + ". " + e.getValue() + " (" + e.getKey() + ")");
}
// 1. Bob (1500)
// 2. Alice (1200)
// 3. Carol (900)

حالة استخدام: جدولة الأحداث

اربط الطوابع الزمنية بالأحداث، ثم استخدم ceilingEntry للعثور على الحدث المجدول التالي بعد وقت معين:

import java.time.LocalTime;
TreeMap<LocalTime, String> schedule = new TreeMap<>();
schedule.put(LocalTime.of(9,0), "Standup");
schedule.put(LocalTime.of(14,0), "Review");
schedule.put(LocalTime.of(17,0), "Retro");

LocalTime now = LocalTime.of(11, 30);
var next = schedule.ceilingEntry(now);
System.out.println("Next: " + next.getValue()); // Review

أداء TreeMap مقابل HashMap

مقارنة المفاتيح:

  • HashMap: ‏O(1) في المتوسط لعمليتي get وput؛ غير مرتبة
  • TreeMap: ‏O(log n) لعمليتي get وput؛ مرتبة حسب المفتاح
  • LinkedHashMap: ‏O(1) في المتوسط؛ مرتبة حسب ترتيب الإدراج

استخدم TreeMap عندما تحتاج إلى مفاتيح مرتبة أو استعلامات عن نطاقات. أما HashMap فهي أسرع للبحث البسيط عن المفاتيح.

أمان الخيوط

TreeMap ليست آمنة للخيوط. للوصول المتزامن، استخدم ConcurrentSkipListMap، التي تحافظ أيضًا على الترتيب وتوفّر عمليات بتعقيد O(log n)، مع دعم القراءة والكتابة المتزامنتين.

تحقق سريع

لديك TreeMap<Integer, String> بمفاتيح {10, 20, 30, 40}. ماذا تعيد map.floorKey(25)؟

مراجعة: TreeMap

أهم النقاط:

  • تحافظ TreeMap على المفاتيح بترتيب مرتب تصاعدي باستخدام شجرة حمراء-سوداء
  • جميع العمليات بتعقيد O(log n)
  • التنقل: firstKey وlastKey وfloorKey وceilingKey وlowerKey وhigherKey
  • عروض النطاق: subMap وheadMap وtailMap، وهي عروض مرتبطة بالخريطة الأصلية
  • استخدم ConcurrentSkipListMap للخرائط المرتبة الآمنة للخيوط

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

هل درس «TreeMap: أزواج المفاتيح والقيم المرتبة» مجاني؟

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

ماذا ستتعلم في «TreeMap: أزواج المفاتيح والقيم المرتبة»؟

استخدم TreeMap للحفاظ على الترتيب، والتنقل باستخدام firstKey وlastKey وfloorKey وceilingKey تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «TreeMap: أزواج المفاتيح والقيم المرتبة»؟

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

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

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

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

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