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);
}
}
Сравнивая общие типы в Java, как игнорировать колпачки, если тип является строкой?
-
29-07-2022 - |
Вопрос
У меня есть проблема при сравнении общего типа, у меня есть запись, и теперь я должен сравнить ключ с другим ключом, поэтому, не думая, что я сделал равные ...
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)
Но проблема, очевидно, заключается в том, что если у меня есть строка, и исключение случая Caps не произойдет .... EqualsIgnoreCase не может быть использован, конечно.
Итак, как я могу заставить это работать с каждым типом? В том числе струны с помощью кепок
Решение
Другие советы
Если это реальное требование, то есть два логических решения, которые приходят на ум ....
Первый вариант - просто преобразовать все значения ключей в карте в нижний регистр (или прописное), когда вы их вставляете, а затем вам не придется беспокоиться о случае в сравнении.
Другой вариант состоит в том, чтобы использовать специальную обертку для каждого ключа, которая делает для вас метод равных:
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
ключевое значение.
Надеюсь, это поможет.