使用键或索引从Java中的数据类型中检索值

时间:2011-12-09 15:59:56

标签: java types dictionary

我希望有一个存储键值对的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的问题是,是否存在执行此操作的现有数据类型,还是在我的自定义数据类型中实现此方法的更有效方法?

2 个答案:

答案 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与地图同步,您的实施就可以正常工作。