web-dev-qa-db-ja.com

ArrayList JavaのHashMapキーからすべての値を取得します

良い日、これは今私を混乱させるようなものです(脳のフリーズ!) HashMapを入力するArrayListがあります。今、私は自分のHashMapとarraylistに入れます。

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

 arraylist.put(Map);

JSONを解析しているため、arraylistのサイズがかなり大きくなります。今私の質問は、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++;
                 }

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

33
irobotxxx

仕事をするための何かがすでにあるのに、なぜ車輪を再発明したいのですか。 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());
    }

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

77
Rohit Jain

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

タイプHashMapHashMap<String,String>の-​​keyおよびvalueStringを検討しています

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());

}
11

リストコンストラクターは、リストの構築に使用されるCollectionインターフェイスを実装するデータ構造を受け入れます

すべてのkeysをハッシュマップからリストに取得するには:

Map<String, Integer> map = new HashMap<String, Integer>();
List<String> keys = new ArrayList(map.keySet());

ハッシュマップからリストへのすべてのを取得するには:

Map<String, Integer> map = new HashMap<String, Integer>();
List<Integer> values = new ArrayList(map.values());
8
Sivabalan

ループの最後に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()
} 

別の問題は、date_valueおよびvalue_valuesiを使用していることです。これは、配列にnull値を含めるつもりでない限り無効です。

1
John B

これは信じられないほど古いですが、私は別の質問への答えを見つけようとしてそれに出くわしました。

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

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

mapサイズは常に2の値を返します。これは単なる要素です

HashMapの機能に混乱するかもしれません。 HashMapは、マップ内で1対1関係のみを許可します。

たとえば、次の場合:

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つしか記録されていないため、各キーのフィールドを複数回上書きしただけだと思われます。

1
nukeforum

KeyDataTypeとしてキーデータ型、ValueDataTypeとして値データ型を持つHas​​hmapがあるとします

HashMap<KeyDataType,ValueDataType> list;

必要なすべてのアイテムを追加します。これで、すべてのハッシュマップキーをリストに取得できます。

KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);

それで、今、あなたはすべてのキーを配列mkeys []に入れました

を呼び出すことで任意の値を取得できるようになりました

 list.get(mkeys[position]);
0
chandan

「key1:value1、key2:value2」のような文字列を生成するJava 8ソリューション

private static String hashMapToString(HashMap<String, String> hashMap) {

    return hashMap.keySet().stream()
            .map((key) -> key + ": " + hashMap.get(key))
            .collect(Collectors.joining(","));

}

リストとして単純な収集を作成します

private static List<String> hashMapToList(HashMap<String, String> hashMap) {

    return hashMap.keySet().stream()
            .map((key) -> key + ": " + hashMap.get(key))
            .collect(Collectors.toList());

}
0
Ali Katkar