【问题标题】:Looping Hash Map does not return correct Key循环哈希映射不返回正确的密钥
【发布时间】:2013-09-15 00:41:52
【问题描述】:

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

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 和名称如下:

但只有 Name 可用于 'entry':

entry.getKey() 总是返回作为键的文本“名称”,entry.getValue() 返回作为值的“凯蒂贝利”。

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

【问题讨论】:

  • 请在以后更加注意您的格式 - 请记住 Stack Overflow 不适用于标签;格式化代码时使用空格代替。

标签: java loops arraylist hashmap


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    参考Java HashMap API

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多