从ArrayList Java中的HashMap键中检索所有值

时间:2012-10-18 17:22:43

标签: java arraylist 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键获取所有值?谢谢

9 个答案:

答案 0 :(得分:77)

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

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-loop对我来说很奇怪: -

   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。目前,正如代码所代表的那样,很难理解它的目的是什么。

答案 1 :(得分:11)

以这种方式试试......

我正在考虑HashMap 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());

}

答案 2 :(得分:4)

列表构造函数接受任何实现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());

答案 3 :(得分: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()
} 

另一个问题是您使用i date_valuevalue_values。除非您打算在数组中使用空值,否则这是无效的。

答案 4 :(得分:1)

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

  

我的问题是如何从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中的最终项目相关联。

在您的示例中,您似乎感到困惑的是,只有两个项目,但您只记录了两个键,这让我相信您已经多次简单地覆盖了每个键的字段。< / p>

答案 5 :(得分:0)

假设我的密钥数据类型为KeyDataType的Hashmap 和value数据类型为ValueDataType

HashMap<KeyDataType,ValueDataType> list;

添加您需要的所有项目。 现在,您可以通过。

将所有hashmap键恢复到列表
KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);

所以,现在你得到了数组mkeys []

中的所有键

您现在可以通过调用

来检索任何值
 list.get(mkeys[position]);

答案 6 :(得分: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());

}

答案 7 :(得分:0)

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

Map <String, Object> map;
List<Object> list = new ArrayList<Object>(map.values());

答案 8 :(得分:-1)

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

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

遍历vs进行一些操作