java - 循环 HashMap 不返回正确的键

标签 java loops arraylist hashmap

我有一个 HashMap 类型的数组列表:

public static ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

它有一些像这样的 ID 和名称:

enter image description here

这是用于循环的代码:

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

问题在于这一行:

for (Entry<String, String> entry : map.entrySet())

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

enter image description here

但只有 Name 可用于“entry”:

enter image description here

entry.getKey() 始终返回作为键的文本“name”,entry.getValue() 返回作为值的“Katie Bailey”。

我的问题是为什么我没有通过 entry.getKey() 获取 key ?为什么每次迭代我总是将“名称”作为键?

最佳答案

我怀疑您对调试器的 map 可视化感到困惑。当它显示这个时:

{id=2990511, name=Katie Bailey}

这表明您的 map 有两个条目 - 一个键为 id,值为 "2990511",另一个键为 name “Katie Bailey” 的值。

然后您将遍历所有这些条目,如果值匹配,您将两个条目添加到第二个映射中:一个条目具有键 id 和一个值是键您正在查看的条目,以及带有键 name 和一个值的第二个条目,该值是您正在查看的条目的值。您没有使用整个原始 map - 您只是使用了那个单一条目。

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

{id=name, name=Katie Bailey}

您并不清楚您的期望是什么,但您显示的结果对您的代码来说非常有意义。

我怀疑你实际上想要这样的东西:

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

如果你有固定键,你至少应该考虑创建一个类型来封装数据——例如具有 getName()getId() 方法的 Person 类。

关于java - 循环 HashMap 不返回正确的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18733589/

相关文章:

java - 如何检查一个对象是否在CPU缓存中?

java - 奇怪的队列行为

java - 使用 split 从 Arraylist 中删除正则表达式

循环中的java变量不计数

C++ 函数和类模板声明

Java ArrayList 在自定义条件下删除重复项

java - 仅将 Dagger 2 的依赖项注入(inject)到其中一种产品风格中

返回遍历列表列表的循环内列表的名称

一段代码会干扰循环吗?

java - Android Spinner 使用 ArrayList<String>