当前位置: 首页 > 知识库问答 >
问题:

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

闾丘谦
2023-03-14

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

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。getKey()总是返回文本“name”,它是键和项。getValue()返回值“Katie Bailey”。

我的问题是,为什么我不能在进入时拿到钥匙。getKey()?为什么每次迭代都要用“name”作为键?

共有2个答案

欧阳楚
2023-03-14

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

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

请参阅Java HashMap API

方博学
2023-03-14

我怀疑你被调试器对地图的可视化弄糊涂了。当它展示这个的时候:

{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()/<代码>和<代码> GETIDER()/<代码>方法。

 类似资料:
  • 问题内容: 我目前正在尝试制作一个将动词与西班牙语共轭的程序。我创建了一个哈希表,其中包含一个键和对象Ve​​rb的实例化。键是具有动词不定式形式的字符串(例如“ hablar”)。这是到目前为止我对哈希映射的代码: HashMap中每个动词的键都基于动词的不定式形式。例如,字符串“ hablar”是西班牙语动词的键。Verb类具有一个名为getInfinitive()的方法,该方法返回一个字符串

  • 尝试通过用数字替换重复字符来压缩字符串(例如,字符串将变成)。我试图使用链接哈希图来解决这个问题,因为需要保留输入顺序,但是我创建的计数器似乎没有正确地递增。任何见解都将不胜感激。

  • 输入是一个哈希映射,比如 我想写一个方法,返回类型A的列表,其中有键,值属性与字符串类型,和键值从hashmap。 如何让它成为现实?

  • 我不太熟悉Java流收集器框架,我想解决现实世界中的问题,并想使用流。 下面是实际问题的简化假设场景。 我有一个接口,它的实现返回一个

  • 我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。 基本上, 两种类型的节点: null null 我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点: 然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来

  • > 阅读算法书,需要掌握哈希表的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜Java的HashMap是一个哈希表,因此我想知道HashMaps使用什么机制(链接或探测)? 我需要实现最简单的HashMap与get,put,删除。你能给我指出好的材料来阅读吗? 当用于映射的惟一键是自定义对象时,我们需要在相应的类型中实现hashCode()函数。我做得对吗?或者什么时候需要hash