在Java中,从一个ArrayList的HashMap键检索所有值

56

您好,这有点令我困惑(脑子冻结了!),似乎还漏了些东西。我有一个ArrayList,里面装有一个HashMap。现在我把我的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键获取所有值?谢谢。


如果您想要从两个映射中获取键,则需要实际上从两个映射中获取键。您的代码只从列表中的最后一个映射获取键。 - toadzky
9个回答

93

当你已经有了可以完成工作的工具时,为什么要重新发明轮子?Map.keySet()方法会给你一个包含Map中所有key的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);
   }
你正在遍历列表,并将每个元素赋值给相同的引用 - map,这将覆盖之前的所有值。你会得到列表中最后一个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.: -
你的代码看起来很混乱。我建议把那些代码放到一边,再重新考虑你的设计。目前而言,代码很难理解它在尝试做什么。


3
如果在循环中调用get方法,那么entrySet是迭代Map元素的更好方式。 - John B
@RohitJain 很抱歉回复晚了,发布问题后没有机会回复。我想做的是从映射中获取所有值。正如我在帖子中所说,Hashmap有2个键,通过JSON解析填充,然后添加到ArrayList中。我想检索ArrayList中包含的HashMap的2个键的所有值。是的,我知道第一个“for”循环看起来很奇怪。但我试图获取ArrayList中的所有值,因为Hashmap仅返回2个值的大小,而ArrayList中有更多值。 - irobotxx
@RohitJain 如果您将解释“entrySet”的部分放在答案的上部,而不是谈论“keySet”的部分,那会更好。只需交换这些部分的顺序即可。 - Patricio Córdova

50

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

从哈希映射中获取所有键到列表:

Map<String, Integer> map = new HashMap<String, Integer>();
List<String> keys = new ArrayList<>(map.keySet());
从哈希映射中获取所有的值并转换为列表:
```

To get all the values from a hash map to a list:

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

1
这是我看到的对于这个问题最好的答案!直截了当。 - paulz

13

这样尝试一下...

我正在考虑使用 HashMap,其keyvalue类型均为String,即 HashMap<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());

}

是的,现在没问题了。但是你为什么要把所有的Map值都添加到列表中呢?这真的有必要吗?我认为不需要。任何时候,你想要一个值,都可以直接从Map本身获取。目前为止,很不清楚OP想做什么。 - Rohit Jain
@RohitJain 我已经按照 OP 的要求将值添加到了 ArrayList 中,这也是问题标题所说的内容。 - Kumar Vivek Mitra
@KumarVivekMitra.. 是的,根据 OP 的要求是正确的,但这不是编码的正确方式,你最好添加一些建议。只是为了改进这篇文章而已。 :) - Rohit Jain
@RohitJain 我可以,但我们需要知道程序员想用那些数据做什么...因为我不太清楚他想用那些数据做什么...现在我暂时不建议任何事情... - Kumar Vivek Mitra
@KumarVivekMitra.. 嗯。是的,那部分也正确。干杯 :) - Rohit Jain
@KumarVivekMitra.. 嗯,不用谢。但是为什么呢? :-^ - Rohit Jain

2
创建一个ArrayList,类型为String,以保存Map的值。在构造函数中调用Map类的values()方法。
Map <String, Object> map;
List<Object> list = new ArrayList<Object>(map.values());

1
在你的循环结尾处加上 i++。
在上述代码中,由于每次循环中 i 没有递增,所以数组的 0 位置被覆盖了。
FYI:下面的代码执行了冗余搜索。
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,除非您打算在数组中有空值,否则这是无效的。

下降投票者是否在评论?在上述代码中,数组的第0个位置被覆盖,因为i未被增加。 - John B
他没有发布声明i的代码。如果它在for循环中,那么它可能已经被递增了。你不知道'i'发生了什么,因为他没有发布任何关于'i'的内容。 - toadzky
@toadzky请重新检查帖子。寻找int i = 0;。他确实发布了声明i的代码。 - John B
@JohnB 抱歉回复晚了。但是我已经将 i 的值增加了。我没有意识到我没有复制它。现在会编辑我的代码。 - irobotxx

1
这篇文章非常老,但我在寻找不同问题的答案时偶然发现了它。

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

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

地图大小总是返回一个值为2,这只是元素数

我认为你可能对HashMap的功能感到困惑。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的最后一项相关联。
在你的例子中,你似乎困惑了只有两个项目,但你只记录了两个键,这让我相信你只是多次覆盖每个键的字段。

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

}

0
假设我有一个哈希映射,其键数据类型为KeyDataType,值数据类型为ValueDataType。
HashMap<KeyDataType,ValueDataType> list;

将所需的所有项目添加到其中。 现在,您可以通过以下方式检索所有哈希映射键到列表中。
KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);

所以,现在你已经将所有的键存储在一个数组 mkeys[] 中了

你可以通过调用以下方法来检索任何值

 list.get(mkeys[position]);

-1

它有一种方法可以从映射中找到所有的值:

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

遍历vs执行某些操作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接