我希望有一个存储键值对的Java数据类型,并允许通过键或索引检索该值。
我已经推出了我自己的数据类型,它扩展了java.util.Dictionary
并提供了at
函数来实现按索引检索的功能。
class DataHash <K,V> extends Dictionary<K,V> {
private List<K> keyOrder = new ArrayList<K>();
private Dictionary<K,V> internalDataStore = new Hashtable<K,V>();
@Override
public V put(K key, V value){
//guards go here to prevent null, duplicate keys etc.
this.keyOrder.add(key);
return this.internalDataStore.put(key, value);
}
@Override
public V get(K key){
return this.internalDataStore.get(key);
}
public V at(int index){
K key = this.keyOrder.get(index);
return this.internalDataStore.get(key);
}
//and other functions to extend dictionary etc.
//all keeping the keyOrder in sync with the internalDataStore
}
我对SO的问题是,是否存在执行此操作的现有数据类型,还是在我的自定义数据类型中实现此方法的更有效方法?
答案 0 :(得分:1)
除非必须,否则我不会使用Dictionary或Hashtable。
Map接口和HashMap或LinkedHashMap类通常是更好的选择,因为它们没有被同步。 LinkedHashMap也保留了订单,但索引无法访问。
答案 1 :(得分:1)
@Peter肯定是对的(该死的快速手指)你应该考虑使用非同步类来实现它,并且HashMap
更好用。我想我会在你的代码中添加更多评论。
如果您要延长Map
,那么您不需要internalDataStore
。你可以这样做:
class DataHash <K,V> extends HashMapK,V> {
private List<K> keyOrder = new ArrayList<K>();
@Override
public V put(K key, V value){
keyOrder.add(key);
return super.put(key, value);
}
// you don't need to implement the super class methods unless you need
// to keep keyOrder in sync
public V at(int index){
K key = this.keyOrder.get(index);
return get(key);
}
}
我知道没有Collection
个类允许您通过哈希值按索引和访问。只要您小心保持List
与地图同步,您的实施就可以正常工作。