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);
}
}
مقارنة الأنواع العامة في جافا ، كيفية تجاهل الأغطية إذا كان النوع عبارة عن سلسلة؟
-
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 (). يساوي (مفتاح)
لكن المشكلة ، من الواضح ، هي أنه إذا كان لديّ سلسلة ولن يحدث استبعاد حالة 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
القيمة الرئيسية.
آمل أن يساعد هذا.