قم بإنشاء مقارنة إلى فئة عامة تنفذ قابلة للمقارنة

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

سؤال

لدي فئة عامة تحتوي على متغيرين من النوع، والتي تطبق java.lang.Comparable.

public class DoubleKey<K,J> implements Comparable<DoubleKey<K,J>>{

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2){
        this.key1 = key1;
        this.key2 = key2;
    } 

    public K getFirstKey(){
        return this.key1;
    }

    public J getSecondKey(){
        return this.key2;
    }

    // need for Comparable interface
    public int compareTo(DoubleKey<K,J> aThat){
        ...
    }

}

نظرًا لأنني قمت بتطبيقه باستخدام Comparable، فأنا بحاجة إلى كتابة طريقة CompareTo().لأن K، J يمكن أن يكون من أي اكتب، أواجه مشاكل في كيفية مقارنتها بالكامل.هل هناك طريقة لتتمكن من التقاط جميع الأنواع الممكنة (بدائية، مجمعة، كائنية) في المقارنة؟شكرا للمساعدة!

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

المحلول

لذا لتلخيص ما ورد أعلاه ولغزه معًا في رمز عمل، هذا هو:

    public class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>
        implements Comparable<DoubleKey<K, J>> {

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    public K getFirstKey() {
        return this.key1;
    }

    public J getSecondKey() {
        return this.key2;
    }

    public int compareTo(DoubleKey<K, J> that) {

        int cmp = this.getFirstKey().compareTo(that.getFirstKey());
        if (cmp == 0)
            cmp = this.getSecondKey().compareTo(that.getSecondKey());
        return cmp;
    }
}

نصائح أخرى

هل ترغب في تقديم شرط ذلك K و J هل لديك ترتيب طبيعي يمكنك استخدامه؟في هذه الحالة يمكنك أن تعلن صفك DoubleKey مثله:

class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>

يمكنك بعد ذلك تحديد DoubleKey الخاص بك compareTo كما تحب.يمكنك القيام بأشياء مثل:

getFirstKey().compareTo(aThat.getFirstKey())

لا يمكنك مقارنة أي مثيل لـ K إلى مثال J, ، رغم ذلك.لا يوجد ترتيب محدد لهذه الأنواع.

إذا لم يكن لهذه الأنواع بالضرورة ترتيب طبيعي (كثير منها ليس كذلك)، فيمكنك أن تأخذ Comparator<K> و Comparator<J> كمعلمات لمنشئ الخاص بك DoubleKey.الفصل الذي يقوم بذلك بالفعل والذي يمكنك استخدامه كمثال هو فئة Google Guava الممتازة خرائط فئة (انظر على وجه التحديد newTreeMap الأساليب وحدود الأنواع التي تقبلها).

public class DoubleKey<
        K implements Comparable<K>, 
        J implements Comparable<J>> 
    implements Comparable<DoubleKey<K,J>> {

    public int compareTo(DoubleKey<K,J> that){
        int cmp = this.key1.compareTo(that.key1);
        if(cmp==0) cmp = this.key2.compareTo(that.key2);
        return cmp;
    }
}

سيكون عليك تحديد القاعدة متى أ DoubleKey<K,J> أصغر أو أكبر أو يساوي هذا.هذا ما تفعله المقارنة.ربما هذا هو تخميني الفعلي، وليس من المنطقي مقارنته بحالات DoubleKey<K,J>.

إذا كنت لا تهتم فعليا كيف لقد أمروا ويحتاجون فقط إلى التنفيذ أي للطلب، جرب هذا:

public int compareTo(DoubleKey<K,J> that){
    // real codes needs checks for null values!
    return (this.key1.toString() + this.key2.toString()).compareTo(that.key1.toString() + that.key2.toString());
}

الطريقة الأولى:استخدم رموز التجزئة، مثل

 public int compareTo(DoubleKey<K,J> aThat){
     getFirstKey().hashCode() + getSecondKey().hashCode() - aThat.getFirstKey().hashCode() +   aThat.getSecondKey().hashCode();
 }

(يجب أن تفكر أكثر في الصيغة)

الطريقة الثانية:إضافة المقارنة إلى المنشئ

public DoubleKey(K key1, J key2, Comparator cmp){

كما هو الحال غالبًا، توجد مكتبة يمكنها حل مشكلتك: أباتشي كومنز lang3.كثيرا ما أستخدم زوج<L,R> الحالات كمفاتيح.ينفذون المقارنة.

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