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 (키)
그러나 문제는 분명히 문자열이 있고 CAPS 케이스 제외가 발생하지 않을 것이라는 것입니다.
그렇다면 어떻게 모든 유형과 함께 작동하도록하려면 어떻게해야합니까? 캡이있는 문자열 포함
해결책
다른 팁
이것이 실제 요구 사항이라면 두 가지 논리적 솔루션이 떠 오릅니다 ....
첫 번째 옵션은 맵의 모든 키 값을 삽입 할 때 소문자 (또는 대문자)로 변환 한 다음 비교에서 케이스에 대해 걱정할 필요가 없습니다.
다른 옵션은 각 키에 대한 특수 래퍼를 사용하는 것입니다.
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
핵심 가치.
이게 도움이 되길 바란다.
제휴하지 않습니다 StackOverflow