0

比较泛型类型时遇到问题,我有一个条目,现在我必须将键与另一个键进行比较,所以没想到我做了等于...

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(key)

但问题显然是,如果我有一个字符串并且大写大小写排除将不会发生.... equalsIgnoreCase 当然不能使用。

那么我怎样才能使它适用于每种类型呢?包括带大写的字符串

4

3 回答 3

2
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);
    }
} 
于 2013-11-07T23:05:29.397 回答
2

如果这是一个真正的要求,那么有两个合乎逻辑的解决方案浮现在脑海中......

第一个选项是在插入时将映射中的所有键值转换为小写(或大写),然后您不必担心比较中的大小写。

另一种选择是为每个为您执行 equals 方法的 Key 使用特殊的包装器:

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;
    }
}
于 2013-11-07T23:07:28.450 回答
1

最好的方法,使用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键值。

我希望这有帮助。

于 2013-11-07T23:09:30.693 回答