51

美好的一天,这让我现在有点困惑(大脑冻结!)并且似乎遗漏了一些东西。有一个我用 HashMap 填充的 ArrayList。现在我放入我的 HashMap 和 arraylist。

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

 arraylist.put(Map);

由于正在解析 JSON,因此数组列表的大小显着增加。现在我的问题是如何从数组列表中的两个映射键中获取值?我试过这个

  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 键中获取所有值?谢谢

4

9 回答 9

91

当您已经有工作要做时,为什么还要重新发明轮子。Map.keySet()方法为您提供 Map 中所有键的 Set。

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 回答
36

List 构造函数接受任何实现 Collection 接口的数据结构,用于构建列表。

要将哈希映射中的所有获取到列表:

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());
于 2018-09-17T10:17:59.917 回答
12

试试这个方法...

我正在考虑typeHashMapkeyvalueStringHashMap<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++ 放在循环末尾的某处。

在上面的代码中,数组的 0 位置被覆盖,因为 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]);             
} 

用。。。来代替

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

另一个问题是您正在使用ifordate_valuevalue_values. 除非您打算在数组中包含空值,否则这是无效的。

于 2012-10-18T17:26:50.077 回答
1

这是非常古老的,但我偶然发现它试图找到一个不同问题的答案。

我的问题是如何从数组列表中的两个映射键中获取值?

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

地图大小总是返回值 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

在您的示例中,您似乎对只有两个项目感到困惑,但您只记录了两个键,这使我相信您只是多次覆盖了每个键的字段。

于 2015-08-19T18:33:22.657 回答
0

Java 8 解决方案,用于生成像“key1: value1,key2: value2”这样的字符串

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

}
于 2018-08-25T09:59:01.737 回答
0

创建一个ArrayList类型String来保存地图的值。在其构造函数中调用values()Map 类的方法。

Map <String, Object> map;
List<Object> list = new ArrayList<Object>(map.values());
于 2020-09-17T17:39:23.617 回答
0

假设我有键数据类型为 KeyDataType 和值数据类型为 ValueDataType 的 Hashmap

HashMap<KeyDataType,ValueDataType> list;

添加您需要的所有项目。现在您可以将所有 hashmap 键检索到列表中。

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

所以,现在你得到了数组 mkeys[] 中的所有键

您现在可以通过调用检索任何值

 list.get(mkeys[position]);
于 2017-07-05T11:10:23.250 回答
-1

它具有从地图中查找所有值的方法:

Map<K, V> map=getMapObjectFromXyz();
Collection<V> vs= map.values();
     

迭代vs做一些操作

于 2020-08-17T20:01:39.910 回答