2012-02-08 73 views
0

我正在製作我的電子郵件的信息圖。 它去相當不錯,但事情更混亂,然後他們必須,例如,如果我想獲得的電子郵件的人的數量sended我一個月,然後我用這個:submap一段時間

for (Person p : AL_persons) { 
    for (int y = firstYear; y <= lastYear; y++) { 
    for (int m = 1; m <= 12; m++) { 
     ArrayList<Email> emailThatMonth = new ArrayList<Email>(); 
     for (Email e : p.emails) { 
     if (e.date.year().get() == y 
      && e.date.monthOfYear().get() == m) { 
      emailThatMonth.add(e); 
     } 
     } 
     if (emailThatMonth.size() > maxEmailsMonth) 
     maxEmailsMonth = emailThatMonth.size(); 
    } 
    } 
} 

我想提高該所以我可以更容易, 我想存儲每個月的第一天,所以我可以重新使用它。 (不從這裏經過測試的代碼)

ArrayList<DateTime> monthStarts = new ArrayList<DateTime>(); 

    for (int y = firstYear; y <= lastYear; y++) { 
    for (int m = 1; m <= 12; m++) { 
     monthStarts.add(new LocalDate(y+"-"+m+"-01")); 
    } 
    } 

然後拿到郵件我可以使用子圖:

for(DateTime ld : monthStarts) { 
    ArrayList<Email> emailThatMonth = emails.submap(ld, ld.plusMonths(1)); 
    } 

我認爲這應該工作,但是這是相當一些工作(不,我介意),我只是想知道你們對此的看法,看看是否有人有提示或其他想法來處理它。

注意,我用喬達時間(我喜歡)

+2

那麼......你想得到什麼信息?每個月的電子郵件數量?每個月收到的電子郵件數量最多?看起來你最終編寫了很多變量,它們在超出範圍之前從不讀取。 – Thomas 2012-02-08 23:10:19

+0

我有一個arrayList個人,一個人擁有一個arrayList與來自該人的所有電子郵件。我想每個人在一個月內收到總郵件。 我也有一個arrayList來保存所有人的所有電子郵件,所以我想從一個月(所有人)獲取所有電子郵件。 – clankill3r 2012-02-09 12:05:05

回答

0

目前的第一部分着眼通過所有電子郵件每個人12 * NUMYEARS倍。您可以簡化爲僅通過查找每封電子郵件中的月份並隨時增加不同的計數器來查看一次。我沒有測試過這個代碼,因爲我不確定你的類結構中的一些細節。

HashMap<Person,HashMap<String,Integer>> hm = new HashMap<Person,HashMap<String,Integer>>(); 
for (Person p : all_persons) 
{ 
    HashMap<String,Integer> tempMap = new HashMap<String,Integer>(); 
    for (Email e : p.emails) 
    { 
    String tag = e.date.year().get() + "-" + e.date.monthOfYear().get(); 
    int lastvalue = tempMap.get(tag); 
    tempMap.put(tag, lastvalue+1); 
    } 
    hm.put(p,tempMap); 
} 

因此,對於第二部分(搜索給定月份的所有電子郵件),我們採用了相同的方法。遍歷一次並將所有匹配添加到新列表中。

String targetMonth = "2012-01";//or whatever month you're looking for 
ArrayList<Email> emailThatMonth = new ArrayList<Email>(); 
for (Email e: emails) 
{ 
    String tag = e.date.year().get() + "-" + e.date.monthOfYear().get(); 
    if (tag.compareToIgnoreCase(targetMonth) == 0) 
     emailThatMonth.add(e);  
} 
+0

你能解釋一下我的冒險嗎? 另外我注意到,我用localDate,所以這是一個非常糟糕的想法,因爲我可以在同一天有幾個電子郵件和localDate沒有小時等,但我可以改變這dateTime。 – clankill3r 2012-02-10 11:40:26

+0

在第一個中,您經歷了每個人的電子郵件列表,一連串4個嵌套循環。通過每個人的名單1次,2個嵌套循環。它還提供了歷史記錄,在您的示例中唯一沒有超出範圍的變量是1個月的最大值,而您表示您希望每個月的編號。 – Thomas 2012-02-10 13:40:28