2011-12-09 13 views
0

我希望有一個Java數據類型存儲鍵值對,並允許通過鍵或索引檢索值。使用鍵或索引從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 
} 

我的問題那麼是,是否有這這樣做,或者在我的自定義數據類型來實現這個更有效的方式現有數據類型?

回答

1

我不會使用Dictionary或Hashtable,除非必須。

通常Map接口和HashMap或LinkedHashMap類是更好的選擇,因爲它們沒有被同步。 LinkedHashMap也保留順序但不能被索引訪問。

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與地圖同步,您的實施應該可以正常工作。