هل هناك طريقة جيدة للحصول على Map<String, ?> ووضع تجاهل الحالة؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل هناك طريقة جيدة للحصول على Map<String, ?> الحصول على ووضع تجاهل القضية؟

هل كانت مفيدة؟

المحلول

يقوم TreeMap بتوسيع الخريطة ويدعم المقارنات المخصصة.

توفر السلسلة مقارنة افتراضية غير حساسة لحالة الأحرف.

لذا:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

المقارنة لا تأخذ في الاعتبار اللغة.اقرأ المزيد عنها في JavaDoc.

نصائح أخرى

يمكنك استخدام CaseInsensitiveMap من مجموعات أباتشي كومنز.

هل سيكون من الممكن تنفيذ الخريطة الخاصة بك التي تتجاوز أساليب الوضع/الحصول؟

public class CaseInsensitiveMap extends HashMap<String, String> {
    ...
    put(String key, String value) {
       super.put(key.toLowerCase(), value);
    }

    get(String key) {
       super.get(key.toLowercase());
    }
}

لا يجبرك هذا الأسلوب على تغيير نوع "المفتاح" الخاص بك ولكن تطبيق الخريطة الخاص بك.

أنت بحاجة إلى فئة مجمعة لمفتاح السلسلة الخاص بك مع تطبيق يساوي () و hashCode () غير حساس لحالة الأحرف.استخدم ذلك بدلاً من سلسلة مفتاح الخريطة.

انظر مثال التنفيذ في http://www.java.happycodings.com/Java_Util_Package/code3.html لقد وجدت ذلك في دقيقتين من البحث على جوجل.يبدو معقولا بالنسبة لي، على الرغم من أنني لم أستخدمه أبدا.

الحلول الثلاثة الواضحة التي تتبادر إلى الذهن:

  • قم بتطبيع الحالة قبل استخدام سلسلة كمفتاح (لا تعمل اللغة التركية بشكل مختلف عن بقية العالم).

  • استخدم نوع كائن خاصًا مصممًا لاستخدامه كمفتاح.هذا مصطلح شائع للتعامل مع المفاتيح المركبة.

  • استخدم TreeMap مع مقارن غير حساس لحالة الأحرف (ربما قوة أساسية أو ثانوية java.text.Collator).لسوء الحظ، لا تحتوي مكتبة Java على مقارن مكافئ لـ hashCode/equals.

يمكنك استخدام ترخيص Apache الخاص بي CaseInsensitiveMap مناقشة هنا.على عكس إصدار Apache Commons، فهو يحافظ على حالة المفاتيح.إنه ينفذ عقد الخريطة بشكل أكثر صرامة من TreeMap (بالإضافة إلى أنه يحتوي على دلالات متزامنة أفضل) (راجع تعليقات المدونة للحصول على التفاصيل).

Trove4j يمكن استخدام التجزئة المخصصة لـ HashMap.ومع ذلك، قد يكون لهذا آثار على الأداء نظرًا لأنه لا يمكن تخزين رموز التجزئة مؤقتًا (على الرغم من أن Trove4j ربما وجد طريقة للتغلب على هذا؟).لا تحتوي كائنات الغلاف (كما وصفها John M) على نقص التخزين المؤقت هذا.انظر أيضًا إجابتي الأخرى بخصوص TreeMap.

تحقق من الإجابة المقبولة على الرابط أدناه.كيفية التحقق من وجود المفتاح في الخريطة بغض النظر عن الحالة؟

خلاصة القول هي "إن الحل الأبسط هو ببساطة تحويل جميع المدخلات إلى أحرف كبيرة (أو أحرف صغيرة) قبل الإدراج/التحقق.يمكنك أيضًا كتابة غلاف الخريطة الخاص بك والذي سيقوم بذلك لضمان الاتساق."

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top