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

向HashMap添加元素-.containsKey()始终返回false

曹旭
2023-03-14

我有邮件地址的列表 以及用户ID(列表中的每个条目类似于:id:123mail:“john@doe.com”)。

我想创建一个hashmap,其中每个键都是电子邮件地址的域名,value是来自该域的电子邮件列表:

"foo.com":
  [1]
      id: 123,
      mail: a@foo.com
  [2]
      id: 345
      mail: b@foo.com
"bar.com":
  [1]
      id: 787,
      mail: a@bar.com
  [2]
      id: 456
      mail: b@bar.com

为了达到这个目的,我做下面的事情。问题是,当我试图向domain条目上现有的列表添加新的列表条目时,java会向sortedaddresss添加新的记录,而不是使用当前的记录。我的预测是containskey()方法总是返回false。

HashMap<String, List> sortedAddresses = new HashMap<String, List>();

        for(HashMap<String, String> r : this.lightUsersList){

            String mail = r.get("email");
            Integer uid = Integer.parseInt(r.get("id"));


            try{
                String[] mailSplit = mail.split("@");
                String domain = mailSplit[1];

                //if domain key doesn't exist, add it to hashmap
                if(!sortedAddresses.containsKey(domain)){
                    List<HashMap> domainAddr = new ArrayList<HashMap>();
                    sortedAddresses.put(domain, domainAddr);
                }

                List<HashMap> domainAddr = sortedAddresses.get(domain);
                sortedAddresses.remove(domain);
                domainAddr.add(r);
                sortedAddresses.put(domain, domainAddr);

            }
            catch(Exception e){
                //to be implemented
                System.out.println("Nie udalo sie dodac adresu " + mail + " do tablicy domenowej (" + e.getMessage() + ")");
            }



                //displaying hashmap summary (source from another SO thread)
                Iterator it = sortedAddresses.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pairs = (Map.Entry)it.next();
                    System.out.println(pairs.getKey() + " = " + sortedAddresses.get(pairs.getKey()).size());
                    it.remove(); // avoids a ConcurrentModificationException
                } 
        }

我得到的输出:

foo = 1
bar = 1
foo = 1
bar = 1

应该是:

foo = 2
bar = 2

共有1个答案

鲍永春
2023-03-14

好吧,看来我看到我犯错的地方了。当然iterator部分应该在for循环之后。我的错。讨厌星期一。

 类似资料:
  • 我有一个有趣的情况,我将存储到中。 现在,奇怪的是,我有一段代码,应该保护,任何坐标都不应该使用两次。但如果我调试这段代码: ...始终返回,尽管我在映射中存储了一个哈希代码为9731的坐标,并且当前coord的哈希代码也为9731。 之后,看起来像: 我可能做错了什么?我没主意了。谢谢你的帮助!

  • 问题内容: 我有一个用于存储对象的HashMap: 但是,当尝试检查键是否存在时,方法会返回。 和方法已实现,但未找到密钥。 调试一段代码时: 我有: 但 是什么原因导致这种奇怪的行为? 问题答案: 将密钥插入地图后,您不得对其进行修改。 编辑:我在Map中找到了javadoc的摘录: 注意:如果将可变对象用作地图键,则必须格外小心。如果在对象是映射中的键的情况下以影响等值比较的方式更改对象的值,

  • 所以我正在尝试制作一个程序,它将使用HashMap计算一个唯一单词出现在一个小文件中的次数。但是,当我尝试通过在我的HashMap上使用. get(key)来增加重复单词的计数时,它返回true而不是我想要转换为的整数值。如何让我的代码返回值而不是布尔值?这是我到目前为止的代码: 我的FindCommons类: 导入java。util。ArrayList;公共类FindCommons{ }

  • 我需要填充一个json文件,现在我有如下内容: 我需要添加另一个“元素”。我的第一步是使用,现在我需要添加新元素。我想我必须使用添加另一个元素,我尝试了以下方法: 但是当我尝试做时,我得到了错误"对象没有方法推送",我认为我做了一些非常错误的事情,因为我没有告诉任何地方的"元素"。 我该怎么做? 编辑:对不起,我脑子里有很多困惑。 我认为从,但我首先得到了我在JSON中输入的内容。 用数组代替对象

  • 我有个文件名测试。json 我读了这个文件,我想得到这个 我要阅读和构建的代码 从JSON的那句话中,我得到了 com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)接受格式错误的JSON 我的绳子坏了? 我试过了 我知道这不是JSON数组。

  • 我正在解析一个文件,其中有城市名和到其他城市的距离,格式如下: 我认为问题在于,当我分割字符串时,它创建了不同的对象,并且由于某种原因,string.equals和/或hashcode()给出了不同的结果。因此,map.get(key)返回空值。但我不知道如何解决这个问题。 }