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);
}
}
Comparando tipos genéricos em java, como ignorar as tampas se o tipo for uma string?
-
29-07-2022 - |
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
Solução
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.