2016-09-20 69 views
0

我正在阅读使用JavaMail API的电子邮件并将每个消息(以及发件人,发送日期等)添加到LinkedHashMap中。接下来,我将LinkedHashMap添加到LinkedHashMaps的ArrayList。然而,奇怪的是整个Hashmapis被最后一个条目覆盖。无法将元素添加到Java中的LinkedHashMap

我有以下代码:

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个元素。换句话说,系统将始终打印“msg24”即使在列表中的第23个要素下面的代码:

 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,消息3等等。这似乎是第24个元素将取代所有以前的元素。但为什么? }

 return msgsLinkedHashMapAsArrayList; 

    } 

我一直在试图找出问题的几个小时。

我在做什么错?

回答

2

当您在循环外部为msgsLinkedHashMap变量赋值时,您总是编辑相同的对象并不断将其添加到列表中。解决的办法是在你的for循环内部移动

Map<String, String> msgsLinkedHashMap = new LinkedHashMap<String, String>(); 

所以你将在每次迭代中创建Map的新实例。