سؤال

أنا أستخدم الجوافة ArrayListMultimap<K,V> جمع الخريطة Integers ل Strings. يوفر الفصل طريقة تسمى containsValue(Object value) الذي يتحقق مما إذا كان Multimap يحتوي على القيمة المحددة لأي مفتاح. بمجرد أن أقرر أن هذا صحيح ، ما هي أفضل طريقة لاسترداد المفتاح المذكور؟

ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create();

if (myMap.containsValue(new Integer(1))
{
   // retrieve the key? 
}
هل كانت مفيدة؟

المحلول

بدلا من استخدام containsValue يمكنك التكرار mymap.entries () الذي يعيد مجموعة من جميع أزواج القيمة الرئيسية. يعبر التكرار الذي تم إنشاؤه بواسطة المجموعة التي تم إرجاعها القيم لمفتاح واحد ، تليها قيم المفتاح الثاني ، وما إلى ذلك:

Integer toFind = new Integer(1);
for (Map.Entry<String, Integer> entry: myMap.entries()) {
    if (toFind.equals(entry.getValue())) {
        // entry.getKey() is the first match
    }
}
// handle not found case

إذا نظرت إلى تنفيذ containsValue إنه يتكرر فقط على قيم الخريطة ، لذا فإن أداء القيام بذلك map.entries() بدلاً من map.values() يجب أن يكون نفس الشيء.

public boolean containsValue(@Nullable Object value) {
    for (Collection<V> collection : map.values()) {
      if (collection.contains(value)) {
        return true;
      }
    }

    return false;
}

في الحالة العامة بالطبع ، لا يوجد بالضرورة مفتاحًا فريدًا لقيمة معينة ، لذا ما لم تكن تعلم أنه في خريطتك ، تحدث كل قيمة فقط مقابل مفتاح واحد ، ستحتاج إلى تحديد السلوك على سبيل المثال إذا كنت تريد المفتاح الأول أو الأخير مفتاح.

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