我实施了以下内容:
public class MultiMapClass<K,V> implements MultiMap<K,V> {
private Map<K, TreeSet<V>> multiMap= new HashMap<K,TreeSet<V>>();
public MultiMapClass(){
}
public void put(K key, V value){
multiMap.get(key).add(value);
}
public Set<V> get(K key){
return multiMap.get(key);
}
}
public class TaggedMultiMapClass<K,T,V> extends MultiMapClass<K,V> implements TaggedMultiMap<K, V, T> {
private Map<K,HashMap<V,T>> tags = new HashMap<K,HashMap<V,T>>();
public TaggedMultiMapClass(){
}
@Override
public void put(K key, V value, T tag) {
tags.get(key).put(value,tag);
}
@Override
public T getTag(K key, V val) {
return tags.get(key).get(val);
}
@Override
public T getTag(TaggedMultiMap.Entry<K, V> entry) {
return tags.get(entry.getKey()).get(entry.getValue());
}
@Override
public Set<T> getTags(K key) {
return (Set<T>) tags.get(key).values(); }
}
Taggedmultimap假设是一个多图,但我对自己的所作所为感到不对。
看起来我只有两个不同的类,有两个不同的表示,根本没有连接。如果我决定一个对象从另一个对象扩展,那么另一个对象是否必须使用第一个对象的某些方法?我无法使用Map<K, TreeSet<V>> multiMap= new HashMap<K,TreeSet<V>>()
执行标记事物(值集的每个值必须具有自己的标记),并且我不需要Map<K,HashMap<V,T>> tags = new HashMap<K,HashMap<V,T>>();
才能使用多重映射。我该怎么办?
答案 0 :(得分:1)
我对自己的所作所为感到不对
你说感觉还不错,这是不对的。 Imgaine,当你做的时候会发生什么
TaggedMultiMap<K, V, T> tmm;
((MultiMap<K,V>)tmm).get(someK); // note you don't override get in TMM
// also note the two get methods of MMC and TMM inspect different maps
((MultiMap<K,V>)tmm).set(someK, someV); // what would the tag be?
等
如果我决定一个对象从另一个对象延伸,那么另一个对象是否必须使用第一个对象的某些方法?
理想情况下,它应该使用全部。
正确使用继承的规范方法是从接口派生,这些接口将是MultiMap<K, V>
(而不是MultiMapClass<K, V>
)。然后你必须实现它,这作为读者的练习......(如果你希望用户为每个值提供标签,可能无法实现)
答案 1 :(得分:0)
TaggedMultiMap是否应该为每个条目都有一个标签?如果是,则可以轻易违反此前提条件 - 您可以使用MultiMap界面在TaggedMultiMap中插入没有标记的条目。
答案 2 :(得分:0)
如果你真的必须使用这种类层次结构,那么你应该在TaggedMultiMapClass中覆盖put方法,如下所示:
@Override
public void put(K key, V value) {
throw new UnsupportedOperationException();
}
这样可以防止向地图添加未标记的值。