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

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

 Map map = new HashMap(); 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 map = new HashMap(); for(Entry entry: map.entrySet()) { System.out.println(entry.getKey()); System.out.println(entry.getValue()); } 

PS : -
你的代码看起来混乱了我。 我建议,把这些代码放在一边,再考虑一下你的design 。 就目前而言,正如代码所代表的那样,很难理解它试图做什么。

试试这种方式……

我正在考虑HashMap类型为StringHashMap

 HashMap hmap = new HashMap(); hmap.put("key1","Val1"); hmap.put("key2","Val2"); ArrayList arList = new ArrayList(); for(Map.Entry map : hmap.entrySet()){ arList.add(map.getValue()); } 

把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作为value_valuesvalue_values 。 除非您打算在数组中包含空值,否则这是无效的。

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

我的问题是如何从arraylist中的两个映射键获取值?

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

Map大小始终返回值2,这只是元素

我想你可能会对HashMap的function感到困惑。 HashMap仅允许地图中的1对1关系。

例如,如果你有:

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

并尝试做这样的事情:

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

此代码最终将键条目"BAR"设置为与列表bars的最终项目相关联。

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

假设我的Hashmap的关键数据类型为KeyDataType,值数据类型为ValueDataType

 HashMap list; 

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

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

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

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

  list.get(mkeys[position]); 

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

 private static String hashMapToString(HashMap hashMap) { return hashMap.keySet().stream() .map((key) -> key + ": " + hashMap.get(key)) .collect(Collectors.joining(",")); } 

并生成一个简单的列表列表

 private static List hashMapToList(HashMap hashMap) { return hashMap.keySet().stream() .map((key) -> key + ": " + hashMap.get(key)) .collect(Collectors.toList()); } 

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

要将哈希映射中的所有都添加到列表中:

 Map map = new HashMap(); List keys = new ArrayList(map.keySet()); 

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

 Map map = new HashMap(); List values = new ArrayList(map.values());