التفسير التفصيلي والفرق بين جافا قابلة للمقارنة والمقارنة
توفر لنا Java آليتين للمقارنة: قابلة للمقارنة ومقارنة. ما هو الفرق بينهما؟ دعنا ناكتشف اليوم.
نوع طبيعي مماثل
قابلة للمقارنة عبارة عن واجهة ضمن حزمة Java.lang ، وهناك طريقة واحدة فقط تُقارن () داخل:
الواجهة العامة قابلة للمقارنة <t> {public int compareto (t o) ؛}مما يسمح للمقارنة كائنات الفئة التي تنفذ لمقارنتها. يتم تنفيذ قواعد المقارنة المحددة وفقًا للقواعد في طريقة المقارنة. هذا الترتيب يسمى النظام الطبيعي.
هناك ثلاث حالات حيث تكون قيمة إرجاع طريقة المقارنة هي:
يلاحظ:
1. نظرًا لأن NULL ليس فئة أو كائنًا ، فيجب عليك الانتباه إلى حالة E.COMPARETO (NULL) عند إعادة كتابة طريقة المقارنة. حتى إذا كان E.equals (NULL) قد أُرجع خطأ ، فيجب أن ترمي طريقة المقارنة بنشاط استثناء مؤشر فارغ nullpointerxception.
2. عند تنفيذ الفئة المماثلة لإعادة كتابة طريقة المقارنة ، فإن نتيجة e1.compareto (e2) == 0 مطلوب عمومًا لتكون متسقة مع e1.equals (e2). وبهذه الطريقة ، في المستقبل ، عند استخدام sortedset وحاويات التجميع الأخرى المرتبة وفقًا للنوع الطبيعي من الفئات ، يمكن ضمان ترتيب البيانات المحفوظة مع الخيال.
قد يكون بعض الناس فضوليين بشأن ما سيحدث إذا تم انتهاك النقطة الثانية أعلاه؟
على سبيل المثال ، إذا قمت بإضافة كائنين A و B إلى sortedset ، فإن AB يرضي (! A.Equals (b) && a.mompareto (b) == 0) ، ولا يوجد أي مقارنة أخرى محددة ، ثم عند إضافة A ثم B ، فإنه سيضيف خطأ ، ولن يزداد حجم الفائدة ، لأنه في حالة ما ، لا يُسمح بالازدواجية في التصنيف.
في الواقع ، فإن نتائج جميع فئات Java الأساسية التي تنفذ الواجهة المماثلة تتوافق مع طريقة المساواة.
قائمة أو المصفوفات التي تنفذ الواجهة المماثلة يمكن فرزها باستخدام أساليب collections.sort () أو المصفوفات.
يمكن استخدام الكائنات التي تنفذ الواجهة المماثلة مباشرةً مباشرة كمفاتيح لـ SortedMap (sortedSet) ، وإلا يجب تحديد قواعد فرز المقارنة في الخارج.
لذلك ، إذا كنت ترغب في استخدام فئات التجميع المطلوبة للفصل الذي تحدده ، فأنت بحاجة إلى تنفيذ الواجهة المماثلة ، مثل:
** * الوصف: كتاب فئة الكيان المستخدم للاختبار ، ينفذ الواجهة المماثلة ، الفرز الطبيعي * <br/> * المؤلف: shixinzhang * <br/> * البيانات: 10/5/2016 */Public Class Bookbean يسلط تسلسلي ، قابلة للمقارنة {اسم السلسلة الخاصة ؛ عدد int الخاص bookbean العامة (اسم السلسلة ، العدد int) {this.name = name ؛ this.count = count ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public int getCount () {return count ؛ } public void setCount (int count) {this.count = count ؛ } / ** * rewrite يساوي * param o * return * / Override public boolean equals (object o) {if (this == o) return true ؛ إذا (! (o مثيل من bookbean)) العودة خطأ ؛ Bookbean Bean = (bookbean) o ؛ if (getCount ()! = bean.getCount ()) إرجاع خطأ ؛ إرجاع getName (). equals (bean.getName ()) ؛ } /*** أعد كتابة طريقة الحساب لـ HashCode* حساب التكراري بناءً على جميع السمات لتجنب الازدواجية* يتم رؤية عامل الحساب 31 عند حساب الرمز. إنه رقم رئيسي ولا يمكن تقسيمه مرة أخرى * regurn */ Override public int hashcode () {// call string's hashcode () ، والذي يمثل فقط محتوى سلسلة int int = getName (). hashcode () ؛ // اضرب في 31 ، بالإضافة إلى نتيجة العد = 31 * النتيجة + getCount () ؛ نتيجة العودة } Override Public String ToString () {return "bookbean {" + "name =" " + name + '/' ' +" ، count = " + count +'} '؛ } / ** * عند إضافة bookbean إلى treeset ، سيتم استدعاء هذه الطريقة لفرز * param آخر * regurn * / Override public int compareto (كائن آخر) {if (extry extreamof bookbean) {bookbean otherbook = (bookbean) آخر ؛ نتيجة. // على سبيل المثال ، الفرز حسب سعر الكتاب هنا نتيجة = getCount () - otherbook.getCount () ؛ // أو اتبع سلسلة ترتيب المقارنة // result = getName (). compareto (otherbook.getName ()) ؛ إذا (النتيجة == 0) {// عندما يكون سعر الكتاب هو نفسه ، قارن العنوان. تأكد من مقارنة جميع السمات النتيجة = getName (). المقارنة (otherbook.getName ()) ؛ } نتيجة الإرجاع ؛ } // return 0 return 0 ؛ }أعاد الرمز أعلاه أيضًا كتابة أساليب Quareas () و HashCode (). تحتاج الفصول المخصصة إلى إعادة كتابة هذه الأساليب عندما يرغبون في مقارنتها.
عند إعادة كتابة المقارنة لاحقًا ، تحتاج إلى الحكم على ما إذا كانت سمة معينة هي نفسها ومقارنة جميع السمات مرة واحدة.
الواجهة المماثلة هي جزء من إطار مجموعات Java.
المقارنة المخصصة الفرز
المقارنة هي أيضا واجهة تحت حزمة java.util. قبل JDK 1.8 ، لم يكن هناك سوى طريقتين:
المقارنة بين الواجهة العامة <T> {public int compare (t lhs ، t rhs) ؛ منطقية عامة متساوية (كائن كائن) ؛}تمت إضافة العديد من الطرق الجديدة إلى JDK 1.8:
في الأساس ، ترتبط جميعها بالوظيفة ، ولن يتم تقديم الإضافات الجديدة إلى 1.8 هنا.
مما سبق ، يمكننا أن نرى أن استخدام الفرز الطبيعي يتطلب فئات لتنفيذ قابلة للمقارنة ، ويتم إعادة كتابة طريقة المقارنة داخليًا.
يقوم المقارنة بتعيين قواعد الفرز خارجيًا ويمررها إلى فئات معينة كمعلمات سياسة الفرز ، مثل المجموعات. sort () أو المصفوفات.
يتم تقسيم كيفية استخدامه بشكل أساسي إلى ثلاث خطوات:
1. إنشاء فئة تنفيذ واجهة المقارنة وتعيين قيمة لكائن
اكتب قواعد الفرز للفئات المخصصة في طريقة المقارنة
2. تمرير كائن المقارنة كمعلمة إلى طريقة فئة الفرز
3. أضف فئة مخصصة تستخدم في طريقة المقارنة مع فئة الفرز
على سبيل المثال:
// 1. قم بإنشاء كائن يقوم بتطبيق مقارنات واجهة المقارنة = New Comparator () {Override Public int (Object1 ، Object2) {if (Object1 eastionof newBookBean && Object2 مثيل newBookBean) {newBookBean newBookBean = (newBookBean) Object1 ؛ NewBookBean newBookBean1 = (NewBookBean) Object2 ؛ // ارجع إلى المقارنات في الفرز الطبيعي لطريقة المقارنة المحددة ، فهناك إرجاع الكستناء newbookbean.getCount () - NewBookBean1.getCount () ؛ } العودة 0 ؛ }} ؛ // 2. تمرير هذا الكائن كمعلمة رسمية إلى مُنشئ Treeset Treeset = New Treeset (المقارنة) ؛ // 3. أضف كائن الفئة المصممة في طريقة المقارنة في الخطوة 1 إلى Treeset إلى Treeset Treeset.add (NewBookBean ("A" ، 34)) ؛ Treeset.add (NewBookBean ("S" ، 1)) ؛ Treeset.add (NewBookBean ("V" ، 46)) ؛ Treeset.add (NewBookBean ("Q" ، 26)) ؛في الواقع ، يمكننا أن نرى أن استخدام المقارنة هو نموذج استراتيجية. يمكن للطلاب الذين ليسوا على دراية بنموذج الإستراتيجية أن ينقروا هنا لعرضه: وضع الإستراتيجية: تعرف على الروتين الثابت للروايات عبر الإنترنت.
يتم الإشارة إلى واجهة المقارنة في فئة الفرز:
المقارنة <؟ Super K> المقارنة ؛
يمكننا تمرير فئات تنفيذ مقارنة قواعد الفرز المختلفة وصياغة استراتيجيات فرز مختلفة لنفس الفصل.
لخص
طريقتان للفرز في جافا:
فرز طبيعي مماثل. (تنفيذ فئة الكيان)
المقارنة هو نوع مخصص. (إذا تعذر تعديل فئة الكيان ، يتم إنشاؤه مباشرة على المتصل)
عندما يكون موجودًا في نفس الوقت ، فإنه يستخدم قواعد المقارنة (الفرز المخصص) للمقارنة.
بالنسبة لبعض أنواع البيانات العادية (مثل السلسلة ، عدد صحيح ، مزدوج ...) ، فإنها تنفذ الواجهة المماثلة افتراضيًا وتنفيذ طريقة المقارنة ، والتي يمكننا استخدامها مباشرة.
بالنسبة لبعض الفصول المخصصة ، قد يحتاجون إلى تنفيذ استراتيجيات مقارنة مختلفة في مواقف مختلفة. يمكننا إنشاء واجهة مقارنة جديدة ثم نقارنها باستخدام تطبيق مقارن معين.
هذا هو الفرق بين المقارنة والمقارنة.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!