مقدمة
الكلاس TreeMap
يعتبر الكلاس الأكثر تطوراً بين كلاسات المجموعة Map
, و هو يستخدم لتخزين العناصر بشكل Key / Value بالإضافة إلى ترتيب هذه العناصر في الذاكرة بشكل تصاعدي Ascending نسبة للـ keys. و هو يحتوي على دوال أخرى تسهل طريقة الوصول للعناصر.
إذاً الـ TreeMap
كأنه جدول يتألف من عامودين, الأول يحتوي المفاتيح ( Keys ) و الثاني يحتوي على القيم ( Values ).
هنا كل قيمة يتم تخزينها في كائن الـ TreeMap
يجب إعطاءها Key غير مستخدم, لأن كل Key موضوع يسمح لك بالوصول لقيمة واحدة من القيم الموجودة في كائن الـ TreeMap
.
خلاصة, كل عنصر يضاف في كائن الـ TreeMap
يجب أن يحتوي على كائنين, الأول يمثل المفتاح و الثاني يمثل قيمته.
ملاحظة: كائن الـ TreeMap
يمكنه إمتلاك مفتاح واحد نوعه null
, و يمكن وضع القيمة null
كقيمة لأي مفتاح موجود فيه.
طريقة ترتيب العناصر
إفتراضياً, في حال كانت المفاتيح تمثل أرقام, عندها يتم ترتيبهم من العدد الأصغر إلى العدد الأكبر.
أما في حال كانت المفاتيح تمثل نصوص أو كلمات أو أحرف, عندها يتم ترتيبهم ترتيباً أبجدياً.
كما يمكنك تحديد طريقة ترتيب العناصر بنفسك.
بناؤه
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
K
يقصد بها نوع الكائنات التي تمثل مفاتيح.
V
يقصد بها نوع الكائنات التي تمثل قيم.
إذاً الكلاس TreeMap
يرث من الكلاس AbstractMap
, و يطبق الإنترفيسات NavigableMap
- Serializable
- Cloneable
.
مثال شامل
في المثال التالي قمنا بتعريف كائن نوعه TreeMap
, إسمه tm
, ثم أدخلنا فيه 12 عنصر.
بعدها قمنا بتخزين جميع المفاتيح في كائن نوعه Iterator
, إسمه keys
.
و قمنا أيضاً بتخزين جميع القيم في كائن نوعه Iterator
, إسمه values
.
بعدها عرضناهم كجدول يتألف من عامودين من خلال الحلقة while
.
لاحظ أنه تم عرضهم بترتيب تصاعدي حسب المفاتيح.
في الأخير قمنا بالبحث عن قيمة مفتاح أدخالناه سابقاً.
Main.java
import java.util.TreeMap; // TreeMap هنا قمنا باستدعاء الكلاس
import java.util.iterator; // iterator هنا قمنا باستدعاء الإنترفيس
public class Main {
public static void main(String[] args) {
// و الذي سنضع فيه كود البلد و إسمه tm إسمه TreeMap هنا قمنا بإنشاء كائن نوعه
TreeMap tm = new TreeMap();
// كل عنصر يحتوي على كود البلد كمفتاح و إسمه كقيمة . لاحظ لاحقاً أنه سيتم عرضهم بالتريتب من المفتاح الأصغر إلى المفتاح الأكبر .tm هنا قمنا بإضافة 12 عنصر في الكائن
tm.put("+961", "Lebanon");
tm.put("+962", "Jordan");
tm.put("+963", "Syria");
tm.put("+964", "Iraq");
tm.put("+965", "Kuwait");
tm.put("+966", "KSA");
tm.put("+967", "Yaman");
tm.put("+968", "Oman");
tm.put("+970", "Palestine");
tm.put("+212", "Morocco");
tm.put("+281", "Libya");
tm.put("+20", "Egypt");
// أي وضعنا اكواد البلاد فيه .keys بداخل الكائن tm هنا قمنا بتخزين جميع مفاتيح الكائن
Iterator keys = tm.keySet().iterator();
// أي وضعنا أسماء البلاد فيه .values بداخل الكائن tm هنا قمنا بتخزين جميع قيم الكائن
Iterator values = tm.values().iterator();
System.out.println("The table below contains all Codes & Countries \n");
System.out.println("---------------------");
System.out.println("Code \t | Country");
System.out.println("---------------------");
// لا يزال يحتوي على مفاتيح keys هنا أنشأنا حلقة تستمر في تكرار نفسها طالما أن الكائن
// الفكرة هنا المرور على جميع المفاتيح الموجودة و عرض كل مفتاح موجود و قيمته
while( keys.hasNext() ) {
System.out.println(keys.next() + "\t | " + values.next());
}
System.out.println("---------------------\n");
// KSA هنا قمنا بالبحث عن إسم البلد الذي يملك الكود 996+ فكان الجواب
System.out.println("Which Country use the code +966 ?");
System.out.println(tm.get("+966"));
}
}
سنحصل على النتيجة التالية عند التشغيل.
The table below contains all Codes & Countries
---------------------
Code | Country
---------------------
+20 | Egypt
+212 | Morocco
+281 | Libya
+961 | Lebanon
+962 | Jordan
+963 | Syria
+964 | Iraq
+965 | Kuwait
+966 | KSA
+967 | Yaman
+968 | Oman
+970 | Palestine
---------------------
Which Country use the code +966 ?
KSA