Pergunta

Tenho um problema ao comparar o tipo genérico, tenho uma entrada e agora tenho que comparar a chave com outra chave, então sem pensar que fiz os iguais ...

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 (). Iguals (chave)

Mas o problema, obviamente, é que, se eu tiver uma corda, e a exclusão de casos do CAPS não acontecerá ... O Equalsignorecase não poderá ser usado, é claro.

Então, como posso fazer isso para funcionar com todos os tipos? Incluindo as cordas com tampas

Foi útil?

Solução

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

Outras dicas

Se esse é um requisito real, existem duas soluções lógicas que vêm à mente ....

A primeira opção é apenas converter todos os valores -chave no mapa em minúsculas (ou maiúsculas) quando você os inserir e, em seguida, não precisará se preocupar com o caso na comparação.

A outra opção é usar um invólucro especial para cada chave que faz o método igual para você:

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

Melhor maneira, use instanceof palavra -chave

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

Alternativamente, se sua chave for Comparable, você pode personalizar seu Comparable para lidar com o caso insensível String valor chave.

Eu espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top