Реализует несколько интерфейсов с конфликтом подписей.
-
09-06-2019 - |
Вопрос
Наконец, я попытался реализовать гибридную структуру на Java, что-то вроде:
public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>
Где HasKey — это следующий интерфейс:
public interface HasKey<K> {
public K getKey();
}
К сожалению, существуют некоторые конфликты между сигнатурой метода интерфейса Set и интерфейса Map в Java.В конце концов я решил реализовать только интерфейс Set и добавить метод Map без реализации этого интерфейса.
Вы видите более красивое решение?
В ответ на первые комментарии, вот моя цель:
Иметь структуру набора и иметь возможность эффективного доступа к подмножеству значений этого набора, соответствующему заданному значению ключа.Вначале я создал экземпляр карты и набора, но попытался объединить две структуры, чтобы оптимизировать производительность.
Решение
Возможно, вы могли бы добавить больше информации о том, какие операции вам действительно нужны.Я думаю, вы хотите создать набор, который автоматически группирует элементы по ключу, верно?Вопрос в том, какие операции вы хотите иметь?Как элементы добавляются в набор?Можно ли удалить элементы, удалив их из сгруппированного представления?Мое предложение было бы таким интерфейсом:
public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
Set<V> havingKey(K k);
}
Если вы хотите использовать «Установить как карту», вы можете добавить другой метод.
Map<K,Set<V>> asMap();
Это позволяет избежать использования множественного наследования интерфейсов и связанных с этим проблем.
Другие советы
Что вы пытаетесь достичь? Map
уже предоставляет свои ключи как Set
через его [keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) метод.Если вам нужен надежный порядок итераторов, есть LinkedHashMap и ДеревоКарта.
ОБНОВЛЯТЬ:Если вы хотите гарантировать, что значение было вставлено только один раз, вы можете расширить один из упомянутых выше классов, чтобы создать что-то вроде 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;
}
}
Я бы сказал, что то, что предназначено для использования иногда в качестве карты, а иногда в качестве набора, должно реализовывать карту, поскольку ее можно рассматривать как набор ключей или значений, а также как сопоставление между ключами и значениями.Для этого предназначены методы Map.containsKey() и Map.containsValue().