Реализует несколько интерфейсов с конфликтом подписей.

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

  •  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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top