循环哈希映射不返回正确的密钥

Tha*_*ana 1 java loops arraylist hashmap

我有一个哈希映射类型数组列表:

public static ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
Run Code Online (Sandbox Code Playgroud)

它有一些ID和名称,如下所示:

在此输入图像描述

这是用于循环的代码:

for (HashMap<String, String> map : mylist)
    for (Entry<String, String> entry : map.entrySet())
        if(entry.getValue().contains(typedText)){
            map1 = new HashMap<String, String>();
            map1.put("id", entry.getKey());
            map1.put("name",  entry.getValue());
            mylist1.add(map1);
        }
Run Code Online (Sandbox Code Playgroud)

问题是在这一行:

for (Entry<String, String> entry : map.entrySet())
Run Code Online (Sandbox Code Playgroud)

map.entrySet() 显示正确的ID和名称,如下所示:

在此输入图像描述

但只有名称可用'条目':

在此输入图像描述

entry.getKey()总是返回文本'name'这个键,并entry.getValue()返回'Katie Bailey'这个值.

我的问题是为什么我没有使用entry.getKey()获取密钥?为什么每次迭代时总是将'name'作为键?

Jon*_*eet 6

我怀疑你对调试器对地图的可视化感到困惑.当它显示这个:

{id=2990511, name=Katie Bailey}
Run Code Online (Sandbox Code Playgroud)

这表明你的地图有两个条目 - 一个有一个键值id和一个值"2990511",一个带有一个键值name和一个值"Katie Bailey".

然后你遍历所有这些项目,如果值匹配您要添加两个条目进入第二个地图:一个条目与键id并且是关键的值,你正在寻找的进入,以及第二带有键的条目name和一个值,它是您正在查看的条目的值.你没有使用整个原始地图 - 你只是使用那个单一的条目.

因此,如果您在条目上匹配,name=Katie Bailey最终会得到一个包含两个条目的新地图:

{id=name, name=Katie Bailey}
Run Code Online (Sandbox Code Playgroud)

它并不是很清楚你期待的是什么,但你所展示的结果对你的代码来说非常有意义.

我怀疑你真的想要这样的东西:

for (HashMap<String, String> map : mylist) {
    String name = map.get("name");
    if (name.contains(typedText)) {
       // Create a copy of the whole map
       mylist1.add(new HashMap<String, String>(map));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你有固定密钥,你应该至少考虑创建一个类型来封装数据 - 例如一个Person带有getName()getId()方法的类.