2016-02-01 36 views
6

教師用のオブジェクトのコレクションを格納する必要があり、各生徒に固有のIDがあるとします。 1つの選択肢は、すべてをリストに保存することですが、生徒を検索するときは、線形検索を実行してIDを確認する必要があります。もう1つの選択肢は、次のようなマップを使用することです:Mapキーは実際の生徒オブジェクトにマップする生徒IDです。マップ内にオブジェクトを格納するのが正しい場合

これは、指定された問題に対する分かりやすいアプローチですか?一方では、私は自分のIDで簡単に学生を取得することができるので、それは正しいと感じますが、一方で、私は、学生オブジェクト内に既に存在するidを少し重複して保存しているように感じます。それを2回保存することができますが、そのキーは参照メカニズムです。この冗長性は、あなたがプログラミングに遭遇するだけかもしれませ

public void add(Student s) { 
    lookup.put(s.getId(), s); 
} 
+0

これは私が行うことです。あなたの学生オブジェクトにequals()とhashCodeメソッドを実装することもできます –

+3

データ構造は気持ちについてではありません – wero

答えて

1

私のアドオンは、ようなものになるだろう。

パフォーマンスと可読性の両方の点で、一意のオブジェクトIDを持つマップを使用することの付加価値は、そのようなプラクティスによって発生する小さなオーバーヘッドの価値があります。

このオーバーヘッドが大きすぎると感じる場合は、マップデータ構造内に配置したオブジェクトをIDプロパティから削除し、IDプロパティをキーとしてのみ使用できます。マップキーからIDを推測します。

0

正しい場合はを使用します。ビルドが完了したら、このコレクションを使って何をやろうとしているのかを検討する必要があります。あなたはそれを繰り返すつもりですか?あなたはそれを並べ替えるしたいですか?

Mapを自動的に作成することは可能ですが、反復または並べ替えが難しくなるため、この構造体の有用性には限界があります。

ここには、CurriedHashMapのようなものがあります。フードの下で機能がHashMapであることを無視してください。

class CurriedHashMap<K, V> extends HashMap<K, V> { 

    /** 
    * Function that extracts key from value. 
    */ 
    final Function<V, K> curry; 

    public CurriedHashMap(Function<V, K> curry) { 
     this.curry = curry; 
    } 

    /** 
    * One-value put - the key is intuited from the value using the `curry` function. 
    */ 
    public V put(V value) { 
     return super.put(curry.apply(value), value); 
    } 

} 
関連する問題