Реализует несколько интерфейсов с конфликтом в сигнатурах - PullRequest
3 голосов
/ 16 сентября 2008

Наконец, я попытался реализовать гибридную структуру в 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 и интерфейсом карты в Java. Наконец, я решил реализовать только интерфейс Set и добавить метод Map без реализации этого интерфейса.

Видите ли вы лучшее решение?

В ответ на первые комментарии вот моя цель:

Иметь структуру набора и иметь возможность эффективного доступа к подмножеству значений этого набора, соответствующих данному значению ключа. Вначале я создал карту и набор, но попытался объединить две структуры для оптимизации производительности.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2008

Чего ты пытаешься достичь? Map уже выставляет свои ключи как Set с помощью метода [keySet ()] (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet())). Если вам нужен надежный итерационный порядок, есть 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;
    }
}
1 голос
/ 16 сентября 2008

Возможно, вы могли бы добавить больше информации, какие операции вы действительно хотите. Полагаю, вы хотите создать набор, который автоматически группирует их элементы по ключу, верно? Вопрос в том, какие операции вы хотите провести? Как элементы добавляются в набор? Можно ли удалить элементы, удалив их из сгруппированного представления? Мое предложение будет такой интерфейс:

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

Если вы хотите использовать «Установить как карту», ​​вы можете добавить другой метод

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

Это позволяет избежать использования множественного интерфейса наследования и возникающих проблем.

0 голосов
/ 16 сентября 2008

Я бы сказал, что то, что предназначено для использования иногда как Карта, а иногда как Набор, должно реализовывать Карту, поскольку это можно рассматривать как набор ключей или значений, а также как отображение ключей и значений. Вот для чего предназначены методы Map.containsKey () и Map.containsValue ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...