الحصول على HashSet من مفاتيح HashMap?
سؤال
لدي مجموعة كبيرة جدا (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 ())؛