2011-02-05 20 views
0

私は、キーとその値を持つオブジェクトにデータを保存したいという状況があります。キー名は同じですが、値が変更されます。私はハッシュマップを使用しようとしましたが、これもサポートしていません。それはすべての値を上書きし、最近の値だけをペアで返します。キー名とその値でJavaにデータを格納する方法は?

私の質問は:この問題を解決するのに役立つクラスやメソッドはありますか?

+0

http://www.javaworld.com/jw-07-2000/jw-0707-java101.html – Jason

+0

複数の値を1つのキーに関連付けて保存するとしますか?それは確かに可能です。どちらが正しい値であるかをどのように区別していますか? – ig0774

答えて

4

要件は、単一のキーに対して複数の値を格納する場合

を使用するには、どのようなデータ構造で、 multimapを使用するとよいでしょう。

Google GuavaライブラリのMultimapは、このようなマルチマップの実装例です。

GuavaのMultimapインターフェイスには、キーと値の多重度と順序付けの要件に応じていくつかの実装があります。

実装を

を選択する単純な実装は、キーによってマップされた値は、重複を許可しないHashMultimap、であり、キーの順序は決定要因ではありません。

ArrayListMultimapは、キーにマップされた順序でキーにマップされた値の順序を保持します。

4

複数の値を追跡する必要がある場合は、マップ内でListの値を使用する可能性があります。リストの最後の値が要件を満たしている場合は、最新の値であるという前提を使用できます。そのようなマップを作成する

は(あなたのキーと値の型が文字列である必要はありませんが、彼らはあなたが使っているものは何でもクラスかもしれない)、このように行われることになります。

Map<String, List<String>> map = new HashMap<String, List<String>>(); 

次に取得します指定されたキーの最新値、あなたが対応するリストの最後の要素を取得する必要があるだろう:

List<String> list = map.get(key); 
String value = null; 
if (list != null) { 
    value = list.get(list.size() - 1); 
} 

地図に値を追加するには、ノーならば、新しいリストを作成するためのロジックを追加する必要があると思います値が新しいキーに存在する場合は、新しい値をリストの末尾に追加します。

if (map.get(key) == null) { 
    List<String> list = new ArrayList<String>(); 
    list.add(value); 
    map.put(key, list); 
} 
else { 
    map.get(key).add(value); 
} 
+0

これを行うことが理にかなっている場合は、このロジックをクラスにカプセル化するためにHashMapをサブクラス化することを検討してください。 'put'、' getLast'、 'getAll'などの簡単なインターフェースを提供する –

+0

他の投稿が示唆しているように、マルチマップ実装を含めることもできます。それらは私の心を滑り、私は過去に1つを使用して、それはかなり便利です。 –

+0

あなたは上記の質問のコアJAVAの例を提供することができます。これは本当に面白いですし、example.itであなたの助けを捧げることができれば幸いです。 – Deepak

2

Javaの標準コレクションには、いわゆる「マルチマップ」用のクラスは含まれていませんが、他のいくつかのコレクションライブラリがこの機能を提供しています。例:グーグル・コレクションからのApache Commonsのから

関連する問題