3

私は HashMap 1 を持っています。これには 5 つのキーが含まれており、そのすべてに Hashmap が値として含まれています。これらのサブマップにキーと値のペアを追加したいと考えています。

map1.get(subCategoryMap).put(newKey, newValue); 

私の考えは:

map1.get(subCategoryMap);

別のマップを返します。この行を 2 行に分割すると、次のようになります。

map2 = map1.get(subCategoryMap);
map2.put(newKey, newValue);

しかし、私はそれを1つのステップで行うことをはるかに好みます. それが私がしようとしている理由です

map1.get(subCategoryMap).put(newKey, newValue); 

これは機能しません (オブジェクトに対する .put() は好きではありません)。サブマップにアクセスして、上記のように同じコード行に追加することは可能ですか、それともこれを 2 行に分割する必要がありますか?

4

8 に答える 8

15

ジェネリックを使用すると、次のことができます。

Map<String, Map<String, String>> map1 = ...
map1.get(category).put(subcategory, value);

マップが一般的でない場合:

Map map1 = ...
((Map)map1.get(category)).put(subcategory, value);
于 2009-09-01T15:32:39.517 に答える
9
((Map)map1.get(subCategoryMap)).put(newKey, newValue);

または、ジェネリックを使用します。

Map<X, Map<Y,Z>> map1;

...

map1.get(subCategoryMap).put(newKey, newValue);

ただし、に のマッピングが含まれていないNullPointerException場合、どちらの手法も失敗します。map1subCategoryMap

于 2009-09-01T15:31:46.587 に答える
3

余談ですが(これをコメントにしますが、少し長くなると思います)...

1 行で 1 つの概念的な操作を実行できるのは、プログラマーにとって非常に気分の良いものです。(当時の)プログラマにとっては、より読みやすく、論理的で、ちょうどいいと感じます。

それはほとんど決して良いことではありません。1 つには、後のほうが 2 行よりも解析が難しくなるということです。たとえ今、あなたの直観的な反応が読みやすくなったとしてもです。また、1 行の操作が多いほど、デバッグが難しくなります。

読みやすくするために、Generics ソリューションは 1 行で書くのとほぼ同じだと思います。キャスト ソリューションの場合は 2 行に分けます。また、パラメーターのいずれかが単純な変数ではなく操作である場合は、複数の行に分割します。

多くの人がこれに同意しないことはわかっています。実を言うと、最初はかなりの量を 1 つの行にまとめる傾向がありますが、問題や混乱の最初の兆候で、明確に名前が付けられた変数を使用して、すべてを個別のステートメントに分解するのが簡単になります。

少なくとも重要なことは、ネストされたコレクションの場合、コレクションを別のオブジェクトにラップすることもよくあることです。あなたの場合、これは興味深いでしょう。呼び出しがもう少し明確になります。

dataHolder.put(category, newKey, newVale);

コレクションの入れ子の仕組み (正しく覚えるのが複雑で、失敗しやすい) を隠して、意図をより明確にします。

ネストされたコレクションをラップする (拡張ではなくカプセル化する) このパターンは、最初は奇妙に感じますが、試してみることをお勧めします。これにより、多くのコードがクリーンアップされ、すべてがより安全になり、全員の理解が深まり、「コレクション」が変更されます。 " ビジネス オブジェクト (ビジネス メソッドを配置できる場所 - リファクタリングは、ほとんどすぐに評価されるでしょう) に変換され、通常はコード全体に役立ちます。

于 2009-09-01T16:19:57.457 に答える
0

Generics を使用していない場合、HashMap はキーと値を Object として格納および取得するため、次のようにキャストする必要がある場合があります。

((HashMap)map1.get(subCategoryMap)).put(newKey, newValue);

ただし、より多くのコードを提供していただけると助かります。

于 2009-09-01T15:31:49.550 に答える
0

汎用コレクションを使用する場合、コードは記述どおりに機能するはずです。それ以外の場合は、適切なキャストを 1 行に追加する必要があります。

于 2009-09-01T15:31:53.670 に答える
0

map1のように宣言されている限りMap<OuterKey, Map<InnerKey, MyValue>>、ワンライナーが機能します。subCategoryMapただし、 が存在しない場合に何が起こるかについては注意が必要ですmap1— ワンライナーはNullPointerException.

于 2009-09-01T15:32:19.487 に答える
0

使用できます((HashMap)map1.get(subCategoryMap)).put(newKey, newValue);

また、Java 5 または Java 6 を使用している場合は、generic を使用してキャストを回避できます。HashMap

于 2009-09-01T15:33:11.123 に答える
0

ジェネリックを使用すると正常に動作します。

Map<String,Map<String,Integer>> map = new HashMap<String,Map<String,Integer>>();
map.put("Test", new HashMap<String,Integer>());
map.get("Test").put("Some", 1);
于 2009-09-01T15:34:58.297 に答える