【问题标题】:Unable to Add Elements to LinkedHashMap in Java [duplicate]无法在 Java 中将元素添加到 LinkedHashMap [重复]
【发布时间】: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


    【解决方案1】:

    当您在循环外分配 msgsLinkedHashMap 变量时,您总是在编辑同一个对象并不断将其实例添加到列表中。解决办法是移动

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

    在您的 for 循环中,因此您将在每次迭代时创建新的 Map 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2015-11-20
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2011-11-16
      相关资源
      最近更新 更多