3

最后,我尝试在 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 中的 Map 接口之间存在一些冲突。我最终选择只实现 Set 接口并添加 Map 方法而不实现该接口。

你看到更好的解决方案了吗?

针对第一条评论,这是我的目标:

具有集合结构,并且能够有效地访问该集合的值的子集,对应于给定的键值。一开始我实例化了一个地图和一个集合,但我试图将这两个结构结合起来以优化性能。

4

3 回答 3

3

你想达到什么目的?已经通过它的 [keySet()]( http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet())方法Map公开了它的密钥。如果你想要一个可靠的迭代顺序,有LinkedHashMapTreeMapSet

更新:如果你想确保一个值只被插入一次,你可以扩展我上面提到的类之一来创建类似 a 的东西,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;
    }
}
于 2008-09-16T09:39:55.243 回答
1

也许您可以添加更多信息,您真正想要哪些操作。我猜你想创建一个通过键自动对元素进行分组的集合,对吧?问题是您希望能够进行哪些操作?如何将元素添加到 Set 中?可以通过从分组视图中删除元素来删除它们吗?我的建议是这样的界面:

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

如果您希望能够使用 Set as map 您可以添加另一种方法

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

这避免了使用多个接口继承和由此产生的问题。

于 2008-09-16T10:16:11.677 回答
0

我会说有时用作 Map 有时用作 Set 的东西应该实现 Map,因为它可以被视为一组键或值以及键和值之间的映射。这就是 Map.containsKey() 和 Map.containsValue() 方法的用途。

于 2008-09-16T09:37:59.400 回答