فرض إجمالي الطلب على جميع الحالات من *أي* فئة في جافا

StackOverflow https://stackoverflow.com/questions/28301

  •  09-06-2019
  •  | 
  •  

سؤال

أنا غير متأكد ما إذا كانت التعليمات البرمجية التالية من شأنها ضمان جميع شروط معينة في المقارنة هو جافادوك.

class TotalOrder<T> implements Comparator<T> {

    public boolean compare(T o1, T o2) {
        if (o1 == o2 || equal(o1, o2)) return 0;

        int h1 = System.identityHashCode(o1);
        int h2 = System.identityHashCode(o2);

        if (h1 != h2) {
            return h1 < h2 ? -1 : 1;
        }

        // equals returned false but identity hash code was same, assume o1 == o2
        return 0;
    }

    boolean equal(Object o1, Object o2) {
        return o1 == null ? o2 == null : o1.equals(o2);
    }
}

سوف رمز أعلاه فرض إجمالي الطلب على جميع الحالات من أي فئة ، حتى لو كانت تلك الفئة لا ينفذ مقارنة ؟

هل كانت مفيدة؟

المحلول

انظروا ماذا وجدت!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

أوه نعم, نسيت IdentityHashMap (Java 6 وما فوق فقط).فقط عليك أن تولي اهتماما في الإفراج عن الخاص بك المقارنة.

نصائح أخرى

انظروا ماذا وجدت!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

هذا هو بالضبط ما كنت أبحث عنه.

الإجابة في التعليق الخاص بك:

يساوي عاد كاذبة ولكن الهوية تجزئة القانون نفسه ، افترض o1 == o2

للأسف لا يمكنك أن تفترض ذلك.معظم الوقت هو الذهاب إلى العمل ، ولكن في بعض exceptionnal الحالات ، فإنه لن.وأنت لا تعرف متى.عندما مثل هذه الحالة تظهر أن يؤدي إلى فقدان الحالات في TreeSets على سبيل المثال.

أنا لا أعتقد ذلك لأن هذا الشرط لم يتحقق:

وأخيرا ، فإن المنفذ يجب التأكد من أن x.compareTo(y)==0 يعني أن sgn(x.compareTo(ض)) == sgn(y.compareTo(z)) ، لجميع z.

منذ متساوية(o1, o2) يعتمد على o1 تنفيذ يساوي اثنين من الأشياء التي هي منطقيا متساوية (على النحو الذي يحدده يساوي) لا تزال لديها اثنين differrent identityHashCodes.

حتى عند مقارنتها ثالثة وجوه (z), قد ينتهي الغلة قيم مختلفة compareTo.

معنى ؟

ربما يجب عليك رفع استثناء إذا كان يحصل على هذا الأخير return 0 خط-عندما تجزئة يحدث تصادم.لدي سؤال على الرغم من:كنت تفعل إجمالي الطلب على التجزئة ، التي أعتقد هو جيد ولكن لا وظيفة يتم تمريرها إليه لتحديد المعجمية النظام ؟

    int h1 = System.identityHashCode(o1);
    int h2 = System.identityHashCode(o2);
    if (h1 != h2) {
        return h1 < h2 ? -1 : 1;
    }

لا يمكن تخيل أن لديك الكائنات tuple اثنين من الاعداد الصحيحه التي تشكل العدد الحقيقي.لكنك لن تحصل على الترتيب اللائق بما أنك فقط أخذ تجزئة الكائن.هذا هو كل شيء متروك لكم إذا التجزئة هو ما قصدته, ولكن بالنسبة لي, فإنه لا معنى كبير.

أنا أتفق هذه ليست مثالية ، ومن ثم التعليق.أي اقتراحات ؟

أعتقد أن هناك الآن الطريقة يمكنك حل ذلك ، لأنه لا يمكن الوصول إلى واحد فقط الشيء الوحيد الذي يمكن أن نميز حالتين:عنوان في الذاكرة.لذلك لدي اقتراح واحد فقط:إعادة النظر في ضرورة وجود المجموع العام يأمر عملية في Java :-)

لست متأكدا حقا عن System.identityHashCode(Object).هذا تقريبا ما == يتم استخدام.كنت قد بدلا من ذلك تريد استخدام Object.hashCode() - إنها أكثر بالتوازي مع Object.equals(Object).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top