سؤال

لدي مجموعة كبيرة جدا (100'000s من مقالات) HashMap.الآن أريد HashSet تحتوي جميع المفاتيح من هذا HashMap.لسوء الحظ ، HashMap فقط keySet() طريقة والتي ترجع Set ولكن ليس HashSet.

ما يمكن أن يكون وسيلة فعالة لتوليد مثل هذه HashSet باستخدام جافا ؟

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

المحلول

لماذا على وجه التحديد تحتاج HashSet?

أي مجموعة لها نفس واجهة ، لذلك عادة يمكن أن تستخدم بالتبادل ، جيدة الممارسات يتطلب استخدام مجموعة واجهة لجميع من لهم.


إذا كنت حقا بحاجة لذلك ، يمكنك إنشاء واحد من الآخر.للحصول على التعليمات البرمجية عام ، يمكن أن يكون:

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());

نصائح أخرى

وإذا افترضنا أن كلمة "فعالة" هي جزء أساسي من سؤالك، واعتمادا على ما تريد القيام به مع مجموعة، قد يكون فكرة لإنشاء فئة فرعية الخاصة بك من HashSet الذي يتجاهل تنفيذ HashSet ويقدم وجهة نظر على الخريطة الحالية، بدلا من ذلك.

وكمثال نفذت جزئيا، فإنه قد تبدو شيئا مثل:

public class MapBackedHashSet extends HashSet
{
    private HashMap theMap;

    public MapBackedHashSet(HashMap theMap)
    {
        this.theMap = theMap;
    }

    @Override
    public boolean contains(Object o) 
    {
        return theMap.containsKey(o);
    }

    /* etc... */
}

إذا كنت لا تعرف كيف سيتم استخدام الفئة، سوف تحتاج إلى الحرص على تجاوز كافة الأساليب ذات الصلة.

HashSet myHashSet = new HashSet(myHashMap.keySet());

ولم يحاكم عليها.

هل كنت لا خلق HashSet من Set الحالية؟ ولكن (الأهم) لماذا أنت قلق على تنفيذ عاد إليكم من طريقة keySet()؟

وتعيين مجموعة = HashSet الجديد (map.keySet ())؛

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