どのjavaオブジェクトタイプ(コレクション/リスト/セット/何でも)が必要ですか?
-
30-09-2019 - |
質問
それらが表す値に基づいてキーにされたオブジェクトのコレクションを保存したいと思います。これらのキー できる 繰り返されます。例えば:
[4] => Bob
[5] => Mary
[5] => Sue
[9] => Steve
[10] => Jason
[10] => Michelle
基本的に、私はこれをループして各キーを見て、「キーが現在のキーから1以内にある別のオブジェクト(この場合は人)がありますか?もしそうなら、それらを一致させてコレクションから削除します。 「上記の例では、コレクションが空になるまで「1」の値を反復します(または、奇数のシナリオのオブジェクトが1つ残っています)。
私はこれをやろうとしている方法が最善の方法だと確信していないので、私もフィードバックを受け入れています。
解決
あなたは欲しい マルチマップ. グアバ このインターフェイスとなどのさまざまなサブインターフェイスを提供します ListMultimap
, SetMultimap
と SortedSetMultimap
どのような種類のコレクションを保存したいかに応じて、それから ArrayListMultimap
と HashMultimap
, 、さらに、それらと一緒に使用するためのさまざまな都市があります マルチマップ.
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つのキーに2回マッピングされず、値が入力されている順序を気にしないようにしたい場合は、使用できます。 SetMultimap
aの代わりに ListMultimap
, 、など
「現在のキーからキーが1以内にある別のオブジェクトがある別のオブジェクトがありますか?もしそうなら、それらを一致させてコレクションから削除する」という意味がわかりません。しかし、私がそれを正しく読んでいるなら、あなたは次のようなことをすることができます:
for (Integer key : m.keySet()) {
Collection<String> people = m.get(key);
Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none
...
}
または、aで何かをすることができます TreeMultimap<Integer, String>
キーセットと値セットの両方がソートされます。
他のヒント
aはどうですか Map<Integer, List<String>>
, 、ある種の衝突回避的な方法で。データセットは次のようになります。
[4] => [Bob]
[5] => [Mary, Sue]
[9] => [Steve]
[10] => [Jason, Michelle]
Iteratorコードを少し変更する必要があります。のインデックスを使用します List
彼らの「鍵」としての要素、そしてもちろんあなたはあなたの初期化するためにロジックを追加する必要があります Map
空のリストを使用するか、必ず確認してください Map
の値 null
. 。それはあなたがあなたを生成する方法に依存します Map
.
どんなものはどうですか:
IDictionary<int,IList<Person>>
私は管理する必要があります、私はビジネスロジックに100%従っていませんが、単一のキーの複数の値を持つことができれば、このようなものはそれをサポートする必要があります。
- 編集 - これを無視してください - これがJavaの質問としてタグ付けされたことは私に指摘されました。したがって、の応答:
Map<Integer, List<String>>
もっと適切です。
たぶん次のようなもの:CustomObjectにキーと値がある場所をリストし、リストをキーで並べ替えてください。
それらを順番に処理しているように聞こえるので、キーを順番に繰り返してペアでアイテムを削除したいので、マップが過剰になるかもしれないと思います。