تدعم Treeset طريقتين للفرز: الفرز الطبيعي والفرز المخصص. تستخدم Treeset الفرز الطبيعي افتراضيًا.
1. الفرز الطبيعي
ستستدعي Treeset طريقة Compareto (Object OBJ) لعنصر التجميع لمقارنة علاقة الحجم بين العناصر ، ثم ترتيب عناصر التجميع بترتيب تصاعدي. (preSponse للمقارنة: الكائنان لهما نفس النوع).
يوفر Java واجهة مماثلة ، والتي تحدد طريقة المقارنة (Objecto) ، والتي تعيد قيمة عدد صحيح. عندما يستدعي كائن الطريقة التي يجب مقارنتها باستخدام كائن آخر ، على سبيل المثال OBJ1.comparto (OBJ2) ، إذا كانت الطريقة تُرجع 0 ، فهذا يعني أن الكائنين متساوون ؛ OBJ2 ؛
تنفذ فئات Java المشتركة واجهة مماثلة وتوفر معايير للأحجام المقارنة. الفئات الشائعة التي تنفذ واجهة قابلة للمقارنة:
إذا حاولت إضافة كائن إلى Treeset ، فيجب على فئة الكائن تطبيق الواجهة المماثلة.
سيتم الإبلاغ عن خطأ في البرنامج التالي:
الفئة err {} الفئة العامة testtreerror {public static void main (string [] إضافة (new err ()) ؛يوضح:
يحاول البرنامج أعلاه إضافة كائنات ERAT إلى مجموعة Treeset. من الكائن) تتم مقارنة الطريقة مع العناصر الأخرى في المجموعة - إذا كانت الفئة المقابلة لا تنفذ الواجهة المماثلة ، فسيتم رفع classcastexception. علاوة على ذلك ، عند محاولة إزالة العنصر الأول من العنصر من Treeset ، سيظل استثناء ClassCastexception.
عند مقارنة الكائنات باستخدام طريقة المقارنة (Object OBJ) ، يجب أن يتم إلقاء نوع الكائن المقارن OBJ بنفس النوع ، لأن حالتين فقط من نفس الفئة يمكن أن تقارن الحجم. أي أن الكائن المضافة إلى Treeset يجب أن يكون من نفس الفئة ، وإلا سيتم رفع clascastexception. على سبيل المثال ، عند إضافة كائن سلسلة إلى Treeset ، تكون هذه العملية طبيعية تمامًا. عند إضافة كائن التاريخ الثاني ، ستستدعي Treeset طريقة المقارنة (Object OBJ) للكائن لمقارنتها مع العناصر الأخرى في المجموعة ، وسيقوم البرنامج بإلقاء استثناء في هذا الوقت.
في البرمجة الفعلية ، يمكن للمبرمجين تحديد فئاتهم الخاصة لإضافة أنواع متعددة من الكائنات إلى Treeset ، شريطة أن تقوم الفئة المعرفة من قبل المستخدم بتنفيذ الواجهة المماثلة عند تنفيذ هذه الواجهة. . يتحول. ومع ذلك ، عند تشغيل بيانات التجميع في Treeset ، ستظل استثناءات ClassCastExceptio تحدث لعناصر أنواع مختلفة. (سوف تفهم بعد القراءة بعناية)
عند إضافة كائن إلى مجموعة Treeset ، تستدعي Treeset طريقة مقارنة الكائن (Object OBJ) لمقارنة الحجم مع كائنات أخرى في الحاوية ، ثم تحدد موقع التخزين الخاص بها استنادًا إلى خوارزمية الأشجار الحمراء والأسود. إذا تمت مقارنة كائنين بالتساوي بالمقارنة (Object OBJ) ، فإن Treeset تعتبرهما تخزين نفس الموقع.
بالنسبة لمجموعات Treeset ، فإن معيار تحديد أن كائنين غير متساوين هو: كائنين يعيدون خطأ من خلال مقارنة طريقة متساوٍ ، أو مقارنة المقارنة (Object OBJ) سيتم معالجتها أيضًا ككائنين.
يظهر البرنامج التالي:
. } منطقية عامة (كائن OBJ) {return false ؛ Z1 = 6) ؛ Set) ؛ تصبح رؤية 9 system.out.println ((z) (set.last ()). العمر) ؛نتائج تشغيل البرنامج:
حقيقي
[treeset.z@1fb8ee3 ، treeset.z@1fb8ee3]
9
يوضح:
تتم إضافة الكائن نفسه مرتين في البرنامج ، لأن طريقة متساوية () للكائن Z1 تُرجع دائمًا خطأ ، وتُرجع طريقة المقارنة (Object OBJ) دائمًا 1. وبهذه الطريقة ، ستعتقد Treeset أن كائن Z1 يختلف عن نفسه ، لذا أضف كائنين Z1 إلى Treeset. العنصرين المحفوظان بواسطة كائن Treeset هما في الواقع نفس العنصر. لذلك ، بعد تعديل السمة العمرية للعنصر الأول في مجموعة Treeset ، تتغير السمة العمرية للعنصر الأخير في مجموعة Treeset أيضًا.
ملخص : عندما تحتاج إلى وضع كائن في Treeset ، وإعادة كتابة طريقة () الفئة المقابلة للكائن ، يجب عليك التأكد من أن الطريقة لها نتائج متسقة مع طريقة المقارنة (Object OBJ). يمر كائنان عند إرجاع مقارنة طريقة متساوٍ ، يجب إرجاع الكائنين 0 من خلال مقارنة طريقة المقارنة (Object OBJ).
إذا تمت مقارنة كائنين من خلال طريقة متساوية ، ولكن تتم مقارنة الكائنين بواسطة طريقة المقارنة (Object OBJ) ولا يعودان 0 ، فإن هذا سيؤدي إلى حفظ Treeset في مواقع مختلفة ، بحيث يكون كلا الكائنين يمكن أن يكونا قادرين على ذلك يتم إضافتها بنجاح ، والتي تختلف قليلاً عن قواعد المجموعات المحددة.
إذا كان الكائنان يعودان 0 عن طريق مقارنة طريقة المقارنة (Object OBJ) ، ولكنها تعود خاطئة من خلال مقارنة طريقة متساوية: لأن الكائنين على قدم المساواة بمقارنة طريقة المقارنة (Object OBJ) ، ستحاول Treeset حفظهما في نفس الموقع ، لكنه في الواقع لا يعمل (وإلا سيكون هناك كائن واحد فقط) ، لذلك من المثير للقلق التعامل معه.
إذا تمت إضافة كائن قابل للتغيير إلى Treeset ، فإن البرنامج اللاحق يعدل خصائص الكائن القابل للتغيير ، مما يتسبب في تغيير ترتيب الحجم مع كائنات أخرى ، ولكن لن تقوم Treeset بضبط طلبها مرة أخرى ، وقد تتسبب في حفظه في Treeset هذين الكائنين ، يعودون صحيحًا من خلال مقارنة طريقة متساوين ، وإرجاع طريقة المقارنة (Object OBJ) 0.
يظهر البرنامج التالي:
Class R {int count ؛ IF (OBJ مثيل R) {r r = (r) obj ؛ class testhashset2 {public static void main (] R (9)) ؛ .iterator () ؛ في حالة System.out.println (HS) ؛ -3 r object؟ 5)) ؛نتائج تشغيل البرنامج:
[R (COUNT CUNT: -3) ، R (COUNT STERTIUNT: -2) ، R (COUNT STETRIUNT: 5) ، R (COUNT ATTRIUNTION: 9)]
[R (السمة العد: 20) ، R (السمة العد: -2) ، R (السمة العد: 5) ، R (السمة العد: -2)]
[R (السمة العد: 20) ، R (السمة العد: -2) ، R (السمة العد: 5) ، R (السمة العد: -2)]
[R (السمة العد: 20) ، R (السمة العد: -2) ، R (السمة العد: -2)]
يوضح:
كائن R في البرنامج أعلاه هو إعادة كتابة طبيعية لطريقة متساوين وفئة طريقة مماثلة. يمكنك أن ترى أن الإخراج الأول من البرنامج مرتبة بطريقة منظمة. عندما يتم تغيير خاصية COUNT لكائن R ، تتغير نتيجة إخراج البرنامج أيضًا وتحتوي على عناصر مكررة. بمجرد تغيير خصائص العناصر المتغيرة في مجموعة Treeset ، عندما يتم حذف الكائن في العرض ، ستفشل Treeset في حذفها (حتى العناصر الأصلية في المجموعة لم يتم تعديلها ، ولكن العناصر التي تساوي المعدل لا يمكن حذف العناصر).
عندما يتم حذف كائن R مع -2 ، يمكن حذف البرنامج ؛
ملخص: مع Hashset ، سيكون معقدًا للغاية ومعرضًا للخطأ عند التعامل مع هذه الكائنات. من أجل جعل البرنامج أكثر قوة ، يوصى بوضع الكائنات غير القابلة للتغيير فقط في مجموعات Hashset و Treeset.
2. الفرز المخصص
يعتمد النوع الطبيعي من الأشجار على حجم عناصر التجميع ، وترتبها Treeset بترتيب تصاعدي. إذا كنت بحاجة إلى تنفيذ الفرز المخصص ، مثل الترتيب التنازلي ، يمكنك استخدام واجهة المقارنة. تحتوي هذه الواجهة على طريقة int (t o1 ، t o2) ، والتي يتم استخدامها لمقارنة أحجام O1 و O2.
إذا كنت بحاجة إلى تنفيذ فرز مخصص ، فأنت بحاجة إلى توفير كائن المقارنة عند إنشاء كائن مجموعة Treeset وتوفير كائن المقارنة لربط مجموعة Treeset ، وكائن المقارنة مسؤول عن منطق الفرز لعناصر المجموعة.
يظهر البرنامج التالي:
الفئة M {int Main (String [] args) {treeset ts = new Treeset (New Comparator () {public int compare (Object o1 ، object o2) {m m1 = (m) o1 ؛ m m2 = (m) o2 ؛ if (m1. Age> m2.age) {return -1 ؛ Ts.add (-3) ؛نتائج تشغيل البرنامج:
[M Object (العمر: 9) ، M Object (العمر: 5) ، M Object (العمر: -3)]
يوضح:
ينشئ البرنامج أعلاه كائن فئة داخلي مجهول لواجهة المقارنة ، وهو مسؤول عن فرز مجموعة TS. لذلك عندما نضيف كائنات M إلى مجموعة TS ، ليست هناك حاجة لفئة M لتنفيذ الواجهة المماثلة ، لأنه في هذا الوقت ، لا تحتاج Treeset إلى مقارنة الحجم من خلال كائنات M ، ولكن كائن المقارنة المرتبط بـ Treeset مسؤول عن فرز عناصر التجميع. عند استخدام الفرز المخصص ، تقوم Treeset بفرز عناصر التجميع بغض النظر عن حجم عنصر التجميع نفسه ، ولكن كائن المقارنة مسؤول عن قواعد الفرز لعناصر المجموعة.