【发布时间】:2017-01-28 17:12:16
【问题描述】:
我正在使用 JavaMail API 阅读电子邮件并将每条消息(连同发件人、发送日期等)添加到 LinkedHashMap。接下来,我将 LinkedHashMap 添加到 LinkedHashMap 的 ArrayList。然而,奇怪的是整个 Hashmap 被最后一个条目覆盖了。
我有以下代码:
private ArrayList<LinkedHashMap<String, String>> readAllMsgsFromOutlook() throws FileNotFoundException, IOException, MessagingException
{
LinkedHashMap<String, String> msgsLinkedHashMap = new LinkedHashMap<String, String>();
ArrayList<LinkedHashMap<String, String>> msgsLinkedHashMapAsArrayList = new ArrayList<LinkedHashMap<String, String>>();
//String host = "smtp-mail.outlook.com";
String emailID = ..getEmail();
String password = ..getPassword();
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap-mail.outlook.com", emailID, password);
Folder inboxFolder = store.getFolder("INBOX");
UIDFolder UID = (UIDFolder)inboxFolder;
Message[] msgs = null;
Flags seen = new Flags(Flags.Flag.SEEN);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
msgs = inboxFolder.search(unseenFlagTerm);
System.out.println("Number of New Emails in Inbox: " + msgs.length + "\n");
String senderAsString = "";
String sentDateAsString = "";
String subjectAsString = "";
String contentAsString = "";
String UIDAsString = "";
for (int msgCounter = 0; msgCounter < msgs.length; msgCounter++)
{
System.out.println("Email #: " + (msgCounter + 1) + "\n");
Message msg = msgs[msgCounter];
long UIDAsLong = UID.getUID(msg);
Object content = msg.getContent();
if (content instanceof String)
{
System.out.println("Email is instance of String: \n");
Address[] sender = msg.getFrom();
senderAsString = sender[0].toString();
System.out.println("SENDER: " + senderAsString);
sentDateAsString = msg.getSentDate().toString();
System.out.println("SENT_DATE: " + sentDateAsString);
subjectAsString = msg.getSubject().toString();
System.out.println("SUBJECT: " + subjectAsString);
contentAsString = (String)content;
System.out.println("CONTENT: " + contentAsString);
UIDAsString = String.valueOf(UIDAsLong);
System.out.println("UID: " + UIDAsString);
System.out.println("\n");
}
else if (content instanceof Multipart)
{
System.out.println("Email is instance of Multipart");
Multipart mp = (Multipart)content;
BodyPart bp = mp.getBodyPart(0);
Address[] sender = msg.getFrom();
sentDateAsString = msg.getSentDate().toString();
subjectAsString = msg.getSubject();
contentAsString = bp.getContent().toString();
senderAsString = sender[0].toString();
System.out.println("SENDER: " + senderAsString);
System.out.println("SENT DATE: " + sentDateAsString);
System.out.println("SUBJECT: " + subjectAsString);
System.out.println("CONTENT: " + contentAsString);
UIDAsString = String.valueOf(UIDAsLong);
System.out.println("UID: " + UIDAsString);
System.out.println("\n");
}
msgsLinkedHashMap.put("sender", senderAsString);
msgsLinkedHashMap.put("sentDate", sentDateAsString);
msgsLinkedHashMap.put("subject", subjectAsString);
msgsLinkedHashMap.put("content", contentAsString);
msgsLinkedHashMap.put("UID", UIDAsString);
msgsLinkedHashMapAsArrayList.add(msgsLinkedHashMap);
}
} catch (Exception mex) {
// TODO Auto-generated catch block
mex.printStackTrace();
}
此时添加的内容似乎是正确的。例如,如果我有 24 条消息并且内容是“msg1”、“msg2”、“msg3”等,那么这个系统会打印出正确的内容。
但是,当我在以下右括号之后循环遍历 HashMap 时,我得到的只是第 24 个元素。换句话说,即使对于以下代码中列表中的前 23 个元素,系统也会始终打印“msg24”:
for (int arrayListCounter = 0; arrayListCounter < msgsLinkedHashMapAsArrayList.size(); arrayListCounter++) {
LinkedHashMap<String, String> singleHashmapInArrayList = msgsLinkedHashMapAsArrayList.get(arrayListCounter);
String content = singleHashmapInArrayList.get("content");
System.out.println(">>> " + arrayListCounter + " : " + content);
// 出于某种原因,内容总是等于 msg24 而不是 msg1、msg2、msg3 等。似乎第 24 个元素正在替换所有先前的元素。但为什么? }
return msgsLinkedHashMapAsArrayList;
}
几个小时以来,我一直试图找出问题所在。
我做错了什么?
【问题讨论】:
标签: java arrays arraylist hashmap