我有List<HashMap>
个邮件地址以及用户ID(列表中的每个条目如下:id
:123
,mail
:"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会将新记录添加到sortedAddresses
而不是使用现有记录。我的预测是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
答案 0 :(得分:0)
好吧,似乎我看到了我犯了错误的地方。当然Iterator
部分应该在for
循环之后。我的错。讨厌星期一。