مقارنة الأنواع العامة في جافا ، كيفية تجاهل الأغطية إذا كان النوع عبارة عن سلسلة؟

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

سؤال

لدي مشكلة عند مقارنة النوع العام ، لدي إدخال والآن يجب أن أقارن المفتاح بمفتاح آخر ، لذلك دون التفكير في أنني جعلت متساويًا ...

private DListNode<Entry<K,V>> findNode(K key){
        DListNode<Entry<K, V>> node = head;

        while(node != null && !node.getElement().getKey().equals(key))
            node = node.getNext();

        return node;
    }

! node.getElement (). getKey (). يساوي (مفتاح)

لكن المشكلة ، من الواضح ، هي أنه إذا كان لديّ سلسلة ولن يحدث استبعاد حالة CAPS .... لا يمكن استخدام equalsignoreCase بالطبع.

فكيف يمكنني عمل هذا للعمل مع كل نوع؟ بما في ذلك الأوتار مع قبعات

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

المحلول

private DListNode<Entry<K,V>> findNode(K key){
    DListNode<Entry<K, V>> node = head;

    while(node != null && !specialEquals(node.getElement().getKey(),key))
        node = node.getNext();

    return node;
}

private static boolean specialEquals(K key1, K key2) {
    if( key1 instanceof String && key2 instanceof String ) {
        return ((String) key1).equalsIgnoreCase((String) key2);
    } else {
        return key1.equals(key2);
    }
} 

نصائح أخرى

إذا كان هذا مطلبًا حقيقيًا ، فهناك حلان منطقيان يتبادران إلى الذهن ....

الخيار الأول هو فقط تحويل جميع قيم المفاتيح في الخريطة إلى أحرف صغيرة (أو كبيرة) عند إدخالها ، ومن ثم لن تضطر إلى القلق بشأن الحالة في المقارنة.

الخيار الآخر هو استخدام غلاف خاص لكل مفتاح يقوم بالطريقة المتساوية لك:

class CaseInsensitiveString {
    private final String mystring;

    public CaseInsensitiveString(String val) {
        mystring = val;
    }

    public boolean equals(Object o) {
        return o instanceof CaseSensitiveString
               && mystring.equalsIgnoreCase(((CaseInsensitiveString)o).getString())
    }

    public int hashCode() {
        return mystring.tolowercase().hashCode();
    }

    public String toString() {
        return mystring;
    }
}

أفضل طريقة ، استخدم instanceof الكلمة الرئيسية

while (node != null && node.getKey() != null) {

    if (key instanceof String) {
        String sKey = (String)key;
        if (node.getKey() instanceof String) {
            String nodeKeyString = (String)node.getKey();
            if (nodeKeyString.equalsIgnoreCase(sKey)) {
                return node;
            }
        }
    } else if (node.getKey().equals(key)) {
        return node;
    } else {
        node = node.getNext();
    }
}

بدلاً من ذلك ، إذا كان مفتاحك Comparable, ، يمكنك تخصيص الخاص بك Comparable للتعامل مع حالة غير حساسة للحالة String القيمة الرئيسية.

آمل أن يساعد هذا.

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