3

別の HashMap を含む HashMap があります。最初の HashMap を反復処理し、そこから Key 値を使用したいと考えています。次に、最初の HashMap を反復処理するときに、2 番目の HashMap を反復処理する内部ループを開始して、すべての値を取得します。

これまでの問題は、イテレータからキーを取得する方法がわからないことです。

HashMap<String, HashMap<Integer, String>> subitems = myHashMap.get("mainitem1");

Collection c = subitems.values();
Iterator itr = c.iterator();

while(itr.hasNext())
{
    // Get key somehow? itr.getKey() ???

    // contains the sub items
    HashMap productitem = (HashMap)itr.next();
}

私が取得するデータsubitemsは次のとおりです。

{Item1{0=sub1, 1=sub2}, Item2{0=sub3, 1=sub4}}

次に、while ループproductitemに「サブ項目」が含まれます。しかし、キー値「Item1」と「Item2」をどこから取得できるかわかりません。

どうすればそれらを入手できますか?

4

5 に答える 5

9

からキーを取得できませんvalues().iterator()

を使用する必要がありますentrySet().iterator()。これにより、 およびMap.Entry<K,V>を呼び出すことができるオブジェクトが返されます。getKey()getValue()

for (Map.Entry<Integer,Key> entry : subitems.keySet()) {
  Integer key = entry.getKey();
  String value = entry.getValue();

  // do stuff
}

また、マップのリストのマップが深くネストされているということは、通常、データを保持するカスタム クラスを作成する必要があることを示していることも付け加えておきます。特に、マップに使用する定義済みのキーがあり、リスト内の値の解釈がリスト内の位置に依存する場合は特に! 私はこのコードの匂いを「オブジェクト拒否」と呼んでいます。

于 2012-07-25T08:36:55.333 に答える
3

次のようなことができます (イテレータを使用):

Set<Entry<String, HashMap<Integer, String>>> c = subitems.entrySet();
Iterator<Entry<String, HashMap<Integer, String>>> iterator = c.iterator();

while(iterator.hasNext())
{
    Entry<String, HashMap<Integer, String>> entry = iterator.next();
    System.out.println("key:" + entry.getKey());
    HashMap<Integer, String> innerMap = entry.getValue();
    if (innerMap == null) {
        continue;
    }
    Iterator<Entry<Integer, String>> innerIterator = innerMap.entrySet().iterator();
    while (innerIterator.hasNext()) {
        Entry<Integer, String> innerEntry = innerIterator.next();
        System.out.println("key:" + innerEntry.getKey() + " value: " + innerEntry.getValue());
    }
}

または foreach 構造を使用して次のようにします。

for (Entry<String, HashMap<Integer,String>> entry : subitems.entrySet())
{
    System.out.println("key:" + entry.getKey());
    HashMap<Integer, String> innerMap = entry.getValue();
    if (innerMap == null) {
        continue;
    }
    for (Entry<Integer, String> innerEntry : innerMap.entrySet())
        System.out.println("key:" + innerEntry.getKey() + " value: " + innerEntry.getValue());
    }
}
于 2012-07-25T08:40:26.283 に答える
3

マップ内の値からキーに移動することはできません。(複数のキーが同じ値にマッピングされている場合があります!)

を使用してマップ エントリを反復処理するか、キーを反復処理して、反復ごとに を介して関連付けられた値を取得できます。subitems.entrySet().iterator()subitems.get(key)

于 2012-07-25T08:36:24.807 に答える
2

Java コレクションは の機能を提供しますEntrySet。これは、個々のキーと値をプロパティとして含むオブジェクトのリストです。このリストから反復子を取り出すことができます。

以下の方法でキーを取得できます。

Iterator i= subitems.entrySet().iterator();

while(i.hasNext()){

String key= i.next().getkey();
}
于 2012-07-25T08:40:28.750 に答える
1

entrySet().iterator()最初に使用してエントリを反復処理するHashMapか、キーを取得してそれらを反復処理できます。使用する代わりに、次のキーをsubitems.values().iterator()使用subitems.keys().iterator()して内部ハッシュマップを取得します。

于 2012-07-25T08:37:37.037 に答える