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

时间:2013-09-11 05:52:12

标签: java loops arraylist 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

但只有名称可用'entry':

enter image description here

entry.getKey()始终返回文本'name',这是键,entry.getValue()返回'Katie Bailey',这是值。

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

2 个答案:

答案 0 :(得分:6)

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

{id=2990511, name=Katie Bailey}

表明您的地图有两个条目 - 一个密钥为id,值为"2990511",另一个密钥为name,值为{{1 }}

然后循环遍历所有这些条目,如果值匹配,则在第二个地图中添加两个条目:一个条目带有键"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()课程。

答案 1 :(得分:0)

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

就此而言,你必须提供不同的钥匙才能被替换。对键使用诸如“id”或“name”的字符串意味着键不会改变,值也是如此。

请参阅Java HashMap API