所有值都添加到HashMap中,但仅返回最后一个值

时间:2019-11-01 18:56:43

标签: java hashmap javamail return-value

在下面的方法 demoReadEmail2(String folderName)中,我仅得到HashMap的最后一个元素。但是,在调试和打印期间,所有值都可以正确获取。

public Map<String, Object> demoReadEmail2(String folderName) throws MessagingException,IOException {
    Map<String, Object> stringObjectHashMap = new HashMap<>();
    for (Message message : getUnseenMailsByCurrentDate(folderName)) {
        stringObjectHashMap.put("From",message.getFrom()[0]);
        stringObjectHashMap.put("To",Arrays.toString(message.getRecipients(Message.RecipientType.TO)));
        stringObjectHashMap.put("CC",Arrays.toString(message.getRecipients(Message.RecipientType.CC)));
        stringObjectHashMap.put("BCC",Arrays.toString(message.getRecipients(Message.RecipientType.BCC)));
        stringObjectHashMap.put("Subject",message.getSubject());
        System.out.println(stringObjectHashMap);
    }
   return stringObjectHashMap;
} 

3 个答案:

答案 0 :(得分:2)

问题在于,每次执行循环时,您都将覆盖HashMap属性。一种实现所需目标的方法是,像这样Collection,例如:{p}:

List

答案 1 :(得分:0)

您要在循环中填充地图,在每次迭代时粉碎与相同键关联的值。参见Put Java doc

您最多可以在地图上为每个键("From""To",...)输入一个条目。

如果需要跟踪与同一键关联的多个值,则可以改用Map<String, List<Object>>:请参阅此Key Collision主题。 另一种选择是List<Map<String, Object>>或将索引信息添加到您的条目键:例如From1,...(通过在循环中使用索引)。

答案 2 :(得分:0)

映射将键映射到单个值:

Map<String,String> map = new HashMap();
map.put("key1", "value1");   // Puts value1 in map
map.put("key1", "value2");   // Overwrites value1

所以这取决于您要做什么。

如果要获取所有“发件人”的列表,请为每个零件创建单独的列表:

List<String> froms = new ArrayList();
froms.add(fromValue);

如果要使用具有多个值的Map,请使用Multimap。

Google“ java教程集合”提供了不错的教程。