比较Java中的泛型类型,如果类型是字符串,如何忽略大写?

比较Java中的泛型类型,如果类型是字符串,如何忽略大写?,java,comparison,case-insensitive,Java,Comparison,Case Insensitive,我在比较泛型类型时遇到了一个问题,我有一个条目,现在我必须将该键与另一个键进行比较,所以我没有考虑就等于 private DListNode<Entry<K,V>> findNode(K key){ DListNode<Entry<K, V>> node = head; while(node != null && !node.getElement().getKey().equals(key))

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

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;
    }
专用DListNode findNode(K键){
DListNode=头部;
while(node!=null&&!node.getElement().getKey().equals(key))
node=node.getNext();
返回节点;
}
!node.getElement().getKey().equals(key)

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

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

专用DListNode findNode(K键){
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);
    }
} 
DListNode=头部; while(node!=null&!specialEquals(node.getElement().getKey(),key)) node=node.getNext(); 返回节点; } 专用静态布尔特殊相等(K键1,K键2){ if(字符串的key1实例和字符串的key2实例){ return((String)key1.equalsIgnoreCase((String)key2); }否则{ 返回键1.equals(键2); } }
专用DListNode findNode(K键){
DListNode=头部;
while(node!=null&!specialEquals(node.getElement().getKey(),key))
node=node.getNext();
返回节点;
}
专用静态布尔特殊相等(K键1,K键2){
if(字符串的key1实例和字符串的key2实例){
return((String)key1.equalsIgnoreCase((String)key2);
}否则{
返回键1.equals(键2);
}
} 

如果这是一个真正的需求,那么我会想到两种逻辑解决方案

第一种选择是在插入时将映射中的所有键值转换为小写(或大写),这样就不必担心比较中的大小写问题

另一个选项是为每个键使用一个特殊的包装器,该键为您执行equals方法:

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;
    }
}

如果这是一个真正的需求,那么我会想到两个逻辑解决方案

第一种选择是在插入时将映射中的所有键值转换为小写(或大写),这样就不必担心比较中的大小写问题

另一个选项是为每个键使用一个特殊的包装器,该键为您执行equals方法:

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();
    }
}
或者,如果您的键是
可比的
,则可以自定义
可比的
,以处理不区分大小写的
字符串
键值


我希望这有帮助。

最好的方法是使用
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();
    }
}
或者,如果您的键是
可比的
,则可以自定义
可比的
,以处理不区分大小写的
字符串
键值


我希望这有帮助。

是什么阻止您检查
getKey()
的结果是否为
instanceof String
?这是一个泛型类型,我比较的是K。可以是字符串,但也可能不是。没有什么可以阻止我,但如果我这样做,我必须在之后进行转换,因此每次我要与键进行比较时,我都必须检查它们是否是字符串e的实例进行转换。。。。Java没有任何东西可以解决这种情况?哈!在上面的三条评论发布之前,我开始写我的答案。但实际上除了以某种方式使用
instanceof
之外没有其他选择。是什么阻止您检查
getKey()
的结果是否为
instanceof String
?这是一种泛型,我比较的是K。可以是字符串,但也可能不是。没有什么可以阻止我,但如果我这样做,我必须在之后进行转换,因此每次我要与键进行比较时,我都必须检查它们是否是字符串e的实例进行转换。。。。Java没有任何东西可以解决这种情况?哈!在上面的三条评论发布之前,我开始写我的答案。但是除了以某种方式使用
instanceof
之外,真的没有别的选择了。谢谢你。我想和你相比?如果我用compare to比较两个字符串,它将排除区分大小写的?否。
String
具有
compareTo
compareTignoreCase
。谢谢。我想和你相比?如果我将两个字符串与compare to进行比较,它将排除区分大小写的?否。
String
具有
compareTo
compareTignoreCase