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

しかし、問題は、明らかに、私が文字列を持っていて、キャップケースの排除が起こらない場合です。

では、どうすればこれをあらゆるタイプで動作させることができますか?キャップ付きの文字列を含む

役に立ちましたか?

解決

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

他のヒント

これが実際の要件である場合、頭に浮かぶ2つの論理的なソリューションがあります。

最初のオプションは、マップ内のすべてのキー値を挿入時に小文字(または大文字)に変換するだけで、比較のケースを心配する必要はありません。

もう1つのオプションは、等しいメソッドを実行する各キーに特別なラッパーを使用することです。

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