Java의 일반 유형을 비교하면 유형이 문자열 인 경우 캡을 무시하는 방법은 무엇입니까?

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 (). Equals (키)

그러나 문제는 분명히 문자열이 있고 CAPS 케이스 제외가 발생하지 않을 것이라는 것입니다.

그렇다면 어떻게 모든 유형과 함께 작동하도록하려면 어떻게해야합니까? 캡이있는 문자열 포함

도움이 되었습니까?

해결책

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