51

良い一日、これは今私を混乱させており(脳が凍っている!)、何かが欠けているようです。HashMapを入力するArrayListがあります。今、私は自分のHashMapとarraylistを入れました。

 Map.put(DATE, value1);
 Map.put(VALUE, value2);

 arraylist.put(Map);

JSONを解析しているため、arraylistのサイズが大幅に増加します。今私の質問は、配列リストの両方のマップキーからどのように値を取得するのですか?私はこれを試しました

  if(!list.isEmpty()){   // list is an ArrayList

            for(int k = 0; k < list.size(); k++){
                map = (HashMap)list.get(k);
            }

        }

        Log.d(TAG, "map size is" + map.size());

        String [] keys = new String[map.size()];
        String [] date_value = new String[map.size()];

        String [] value_values = new String[map.size()];

        int i = 0;
        Set entries = map.entrySet();
        Iterator iterator = entries.iterator();

        while(iterator.hasNext()){

            Map.Entry mapping = (Map.Entry)iterator.next();
            keys[i] = mapping.getKey().toString(); 
            date_value[i] = map.get(keys[i]);

            if(keys[i].equals(DATE)){
                date_value[i] = map.get(keys[i]);

            } else if(keys[i].equals(VALUE)){
                value_values[i] = map.get(keys[i]);
            }

                   i++;
                 }

しかし、私はすべての値を取得できないようです。マップサイズは常に2の値を返します。これは単なる要素です。ArrayListのマップキーからすべての値を取得するにはどうすればよいですか?ありがとう

4

9 に答える 9

91

仕事をするために何かをすでに持っているのに、なぜ車輪を再発明したいのですか?Map.keySet()メソッドは、マップ内のすべてのキーのセットを提供します。

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

for (String key: map.keySet()) {
    System.out.println("key : " + key);
    System.out.println("value : " + map.get(key));
}

また、あなたの最初のforループは私には奇妙に見えます: -

   for(int k = 0; k < list.size(); k++){
            map = (HashMap)list.get(k);
   }

リストを繰り返し処理し、各要素を同じreference - mapに割り当てます。これにより、以前のすべての値が上書きされます.リスト内の最後のマップだけが残ります。

編集: -

entrySetマップにキーと値の両方が必要な場合にも使用できます。それはあなたにとってより良い賭けになるでしょう: -

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

    for(Entry<String, Integer> entry: map.entrySet()) {
        System.out.println(entry.getKey());
        System.out.println(entry.getValue());
    }

PS : -
あなたのコードはごちゃごちゃしているように見えます。そのコードを脇に置いて、もう一度考えてみることをお勧めしますdesign。今のところ、コードがそのままでは、何をしようとしているのかを理解するのは非常に困難です。

于 2012-10-18T17:26:01.950 に答える
12

この方法で試してみてください...

typeのHashMapwith keyvalueを検討していますがStringHashMap<String,String>

HashMap<String,String> hmap = new HashMap<String,String>();

hmap.put("key1","Val1");
hmap.put("key2","Val2");

ArrayList<String> arList = new ArrayList<String>();

for(Map.Entry<String,String> map : hmap.entrySet()){

     arList.add(map.getValue());

}
于 2012-10-18T17:38:52.480 に答える
1

ループの最後のどこかに i++ を配置します。

上記のコードでは、各ループで i がインクリメントされないため、配列の 0 の位置が上書きされます。

参考:以下は冗長な検索を行っています:

if(keys[i].equals(DATE)){                 
   date_value[i] = map.get(keys[i]);              
} else if(keys[i].equals(VALUE)){              
   value_values[i] = map.get(keys[i]);             
} 

と置換する

if(keys[i].equals(DATE)){                 
   date_value[i] = mapping.getValue();
} else if(keys[i].equals(VALUE)){              
   value_values[i] = mapping.getValue()
} 

もう 1 つの問題は、ifordate_valueとを使用していることですvalue_values。配列に null 値を含める予定がない限り、これは有効ではありません。

于 2012-10-18T17:26:50.077 に答える
1

これは信じられないほど古いものですが、別の質問に対する答えを見つけようとして偶然見つけました。

私の質問は、arraylist の両方のマップ キーから値を取得する方法です。

for (String key : map.keyset()) {
  list.add(key + "|" + map.get(key));
}

Map size は常に 2 の値を返します。これは単なる要素です。

の機能に戸惑うかもしれませんHashMapマップでは1 対 1の関係HashMapのみが許可されます。

たとえば、次の場合:

String TAG_FOO = "FOO";
String TAG_BAR = "BAR";

次のようなことを試みます。

ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR");
HashMap<String,String> map = new HashMap<>();
for (String bar : bars) {
  map.put(TAG_BAR, bar);
}

"BAR"このコードは、リストの最後の項目に関連付けられるようにキー エントリを設定することになりますbars

あなたの例では、アイテムが2つしかないことに混乱しているようですが、キーが2つしか記録されていないため、各キーのフィールドを複数回上書きしただけだと思います。

于 2015-08-19T18:33:22.657 に答える