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'作为键?
我怀疑你对调试器对地图的可视化感到困惑.当它显示这个:
{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()方法的类.