تنفذ العديد من واجهات الصراع في التواقيع

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

  •  09-06-2019
  •  | 
  •  

سؤال

لاستي ، حاولت أن ينفذ الهجين هيكل في جاوة ، شيء يشبه:

public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>

حيث HasKey هو واجهة التالية:

public interface HasKey<K> {
    public K getKey();
}

للأسف, هناك بعض الصراعات بين methos التوقيع على تعيين واجهة واجهة خريطة في جاوة.أنا اخترت أخيرا أن تنفذ فقط تعيين واجهة لإضافة خريطة طريقة دون تنفيذ هذه الواجهة.

هل ترى أجمل الحل ؟

ردا على التعليقات الأولى, هنا هو هدفي:

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

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

المحلول

وربما يمكن إضافة المزيد من المعلومات التي العمليات هل تريد حقا.أعتقد أنك ترغب في إنشاء مجموعة التي تلقائيا مجموعات العناصر بواسطة مفتاح, أليس كذلك ؟ السؤال هو الذي العمليات هل تريد أن تكون قادرة على ؟ كيف يتم إضافة عناصر إلى مجموعة ؟ أن العناصر المحذوفة عن طريق نقلهم من تجميع الرأي ؟ اقتراحي سيكون واجهة مثل هذا:

public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
    Set<V> havingKey(K k);
}

إذا كنت تريد أن تكون قادرة على استخدام مجموعة الخريطة يمكنك إضافة طريقة أخرى

Map<K,Set<V>> asMap();

أن يتجنب استخدام واجهة متعددة الميراث وما ينتج عنها من مشاكل.

نصائح أخرى

ما الذي تحاول تحقيقه ؟ Map بالفعل الكشف عن المفاتيح Set عبر [مجموعة المفاتيح()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) الأسلوب.إذا كنت تريد موثوق iteratior النظام هناك LinkedHashMap و TreeMap.

تحديث:إذا كنت ترغب في التأكد من أن قيمة تم إدخالها مرة واحدة, يمكنك توسيع واحدة من الفئات المذكورة أعلاه إلى إنشاء ما يشبه SingleEntryMap و تجاوز تنفيذ put(K key, V value) للقيام تفرد تحقق رمي استثناء عندما تكون القيمة وقد تم بالفعل إدراج.

تحديث:سيكون شيئا مثل هذا العمل ؟ (أنا لا أملك محرر حتى هذا قد لا تجمع)

public final class KeyedSets<K, V> implements Map<K,Set<V>> {
    private final Map<K, Set<V>> internalMap = new TreeMap<K, Set<V>>;
    // delegate methods go here
    public Set<V> getSortedSuperset() {
        final Set<V> superset = new TreeSet<V>();
        for (final Map.Entry<K, V> entry : internalMap.entrySet()) {
            superset.addAll(entry.getValue());
        }
        return superset;
    }
}

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

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