2011-12-09 12 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 
} 

SOのための私の質問はこれを行い、既存のデータ型、または私のカスタムデータ型でこれを実装するためのより効率的な方法があるかどうかでしょうか?

答えて

1

あなたがする必要がない限り、私は辞書やハッシュテーブルを使用しません。

MapインターフェイスとHashMapまたはLinkedHashMapクラスは、しばしば日光浴されていないので、より良い選択肢です。 LinkedHashMapは順序を保持しますが、インデックスではアクセスできません。

1

@Peterはこれを実装するために非同期クラスを使用することを検討すべきであり、HashMapを使用する方がよいと確信しています。あなたのコードについてもう少しコメントを追加したいと思っていました。

Mapを延長する場合は、internalDataStoreは必要ありません。それはあなたがハッシュ値によってインデックスによってアクセスすることを可能にする私の知っている何Collectionクラスはありません

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); 
    } 
} 

:あなたのような何かを行うことができます。 Listを地図と同期させておく限り、実装はうまくいくはずです。

関連する問題