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)
しかし、問題は、明らかに、私が文字列を持っていて、キャップケースの排除が起こらない場合です。
では、どうすればこれをあらゆるタイプで動作させることができますか?キャップ付きの文字列を含む
解決
他のヒント
これが実際の要件である場合、頭に浮かぶ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
キー値。
これが役立つことを願っています。
所属していません StackOverflow