Lasty,我尝试用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接口的methos签名和Java中的Map接口之间存在一些冲突。我最终选择只实现Set接口并添加Map方法而不实现此接口。
你看到更好的解决方案吗?
回应第一条评论,这是我的目标:
具有集合结构,并且能够有效地访问该集合的值的子集,对应于给定的键值。 一开始我实例化了一个地图和一个集合,但我试图加入这两个结构来优化性能。
答案 0 :(得分:3)
你想要完成什么? Map
已通过其[keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet())方法将其密钥公开为Set
。如果您需要可靠的迭代订单,则LinkedHashMap和{{3} }。
更新:如果你想确保一次只插入一个值,你可以扩展我上面提到的一个类来创建类似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 :(得分:1)
也许您可以添加更多您真正想要的操作信息。我想你想创建一个用键自动分组元素的集合,对吧?问题是您希望能够拥有哪些操作?如何将元素添加到集合中?可以通过从分组视图中删除元素来删除它们吗?我的建议是这样的界面:
public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
Set<V> havingKey(K k);
}
如果您希望能够使用Set as map,则可以添加其他方法
Map<K,Set<V>> asMap();
这避免了使用多个接口继承以及由此产生的问题。
答案 2 :(得分:0)
我想说有时候用作Map的东西,有时用作Set的东西应该实现Map,因为它可以被视为一组键或值以及键和值之间的映射。这就是Map.containsKey()和Map.containsValue()方法的用途。