Все значения добавляются в HashMap, но возвращаются только последние значения - PullRequest
0 голосов
/ 01 ноября 2019

В приведенном ниже методе 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 ]

2 голосов
/ 01 ноября 2019

Проблема в том, что вы переопределяете свойства HashMap каждый раз, когда выполняется ваш цикл. Способ достижения того, что вы хотите, - это иметь Collection, например List, таким образом:

public List<Map<String, Object>> demoReadEmail2(String folderName) throws MessagingException,IOException {
    List<Map<String, Object>> myList = new ArrayList<>();
    for (Message message : getUnseenMailsByCurrentDate(folderName)) {
        Map<String, Object> stringObjectHashMap = new HashMap<>();
        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());
        myList.add(stringObjectHashMap);
    }
   return myList;
} 
0 голосов
/ 01 ноября 2019

Карта отображает ключ на одно значение:

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

Если вам нужна карта с несколькими значениями, используйте Multimap.

Google "java tutorials collection" для хорошего учебника.

0 голосов
/ 01 ноября 2019

Вы заполняете карту в цикле, уничтожая значение, связанное с теми же ключами на каждой итерации. См. Put Java doc

В лучшем случае вы можете иметь ... одну запись на карте для каждого ключа ("From", "To", ...).

Если вам нужно отслеживать несколько значений, связанных с одним и тем же ключом, вы можете вместо этого использовать Map<String, List<Object>>: обратитесь к этой теме Key Collision . Другой альтернативой является List<Map<String, Object>> или добавление информации индекса к ключам ввода: например, From1, ... (с помощью индекса в цикле).

...