2010-12-03 5 views
2

私は、それらが表す値に基づいてキー設定されたオブジェクトのコレクションを保存したいと思います。これらのキーを繰り返すことができます。例えば:どのJavaオブジェクトタイプ(collection/list/set/whatever)でこれをしたいですか?

[4] => Bob 
[5] => Mary 
[5] => Sue 
[9] => Steve 
[10] => Jason 
[10] => Michelle 

基本的に、私は「これをループにしたいし、各キーを見て、言っては、そのキーの現在のキーから1内にある別のオブジェクト(この場合は人物)があるので、もし、一致していますか?それらを収集してコレクションから削除してください。上記の例では、コレクションが空になるまで(または奇数番目のシナリオでは1つのオブジェクトが残っているまで)、「1」の値を繰り返します。

私はこのことについて最善の方法であることを確信しているとは確信していないので、私もフィードバックに公開しています。私は管理者に持って

​​

、私は100%がビジネスロジックに従っていませんが、あなたは、単一のキーに複数の値を持つことができれば、このようなものは、それをサポートする必要がありますのようなものについては何

+1

したがって、bobで始まり、bobとmaryのキーが1以内にあるため、それらを削除しますか? – jjnguy

+0

@jjnguy - はい、それは正しいです。スティーブとジェイソンは、そのキーが1以内にあるので、削除される次の2つになります。 –

答えて

6

Multimapが必要です。 Guavaはあなたが値をに格納したいコレクションの種類に応じて、このインターフェイスと、このようなListMultimapSetMultimapSortedSetMultimapなど様々なサブインターフェイスを提供します。これは、その後Multimapsでそれらを使用するため、このようなArrayListMultimapHashMultimapなど様々な実装に加え、様々なutlitiesを提供します。

Javaでこれを行う従来の方法は、Map<K, List<V>>,Map<K, Set<V>>などですが、値のコレクションを維持するのは面倒であり、単純な操作(キーの値を入れるなど)ははるかに複雑です彼らが必要とするよりも。

Multimapは、(Mapとは異なり)単一のキーにマップされた複数の値をモデル化するために特別に設計されたデータ構造を意図しています。

ListMultimap<Integer, String> m = ArrayListMultimap.create(); 
m.put(4, "Bob"); 
m.put(5, "Mary"); 
m.put(5, "Sue"); 
... 

for (String name : m.get(5)) { ... } // iterates ["Mary", "Sue"] 

あなたは同じ値が二度1つのキーにマッピングされていないことを確認したいと値がでているため気にしない場合:それはあなたが期待通りの操作が簡単になりますように、ということを考えるとListMultimapの代わりにSetMultimapなどを使用できます。

「現在のキーのキーが1つ以内の別のオブジェクトがあるかどうかわかりませんか?そうであれば、一致させてコレクションから削除してください。

for (Integer key : m.keySet()) { 
    Collection<String> people = m.get(key); 
    Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none 
    ... 
} 

代わりにあなたはその両方のキーセットと値のセットが並べ替えられていますTreeMultimap<Integer, String>で何かをすることができます:私は右のそれを読んでいるなら、あなたはこのような何かを行うことができます。

+0

すごく、ありがとう! –

1

- 編集 - これを無視して、これはJavaの質問としてタグ付けされていることが指摘されました。したがって、との応答:

Map<Integer, List<String>> 

は、はるかに適切です。

+3

質問がそのようにタグ付けされているので、それぞれをJavaでリストしてください:) – AdrianoKF

+0

Argh、Java! :)その部分を逃した。 – matt

+0

またAPI docsディクショナリーで廃止されました – hvgotcodes

5

一種の衝突回避方法では、Map<Integer, List<String>>はどうですか。データセットは次のように変更されます:

[4] => [Bob] 
[5] => [Mary, Sue] 
[9] => [Steve] 
[10] => [Jason, Michelle] 

イテレータコードを少し変更する必要があります。 List要素のインデックスを「キー」として使用します。もちろん、Mapを空リストで初期化するロジックを追加するか、nullMapの値を確認する必要があります。それはあなたのMapの生成方法に依存します。

+1

キータイプは 'int'ではなく' Integer'でなければなりませんが、これは私が取るアプローチです。 –

+0

ああ、そうです。 Javaの世界に住んでからしばらく経っています。 @missingfaktor:編集をありがとう。 –

+0

ありがとう!私はColinDのMultimapの提案に行きましたが、これは私が持っていた元の思考プロセスよりもはるかに優れたアプローチです。 :) –

1

多分ちょうど何かのように:CustomObjectはあなたのキーと値を持っていて、キーでリストをソートします。

あなたはそれらを順番に処理しているように思えるので、キーを順番に反復してペアでアイテムを削除する必要があるので、マップが過剰である可能性があります。

関連する問題