1

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

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

它有一些像这样的 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);
        }

问题是在这一行:

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

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

在此处输入图像描述

但只有名称可用于“条目”:

在此处输入图像描述

entry.getKey()总是返回作为键的文本'name',并entry.getValue()返回作为值的'Katie Bailey'。

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

4

2 回答 2

6

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

{id=2990511, name=Katie Bailey}

这表明您的地图有两个条目 - 一个具有一个键id和一个值"2990511",另一个具有一个键name和一个值"Katie Bailey"

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

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

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

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

于 2013-09-11T06:06:57.293 回答
0

问题是 map 只为键获取唯一值,因此,如果映射中存在键,则无法将其重新插入映射中,这会导致您获得第一个匹配值。

为此,您必须提供要替换的不同密钥。对键使用诸如“id”或“name”之类的字符串意味着键不会改变,值也不会改变。

参考Java HashMap API

于 2013-09-11T06:21:06.450 回答