2012-01-05 48 views
0

之前,我主要是在一定時間內不得不環路天之間,我用這樣的循環:如何使用Joda-Time循環使用幾個月?

for(LocalDate iDate = gv.firstDate; iDate.isBefore(gv.lastDate); iDate = iDate.plusDays(1)) { 
    ... 
} 

現在我有一個TreeMap這樣的:

TreeMap<LocalDate, ArrayList<Email>> dates; 

我想遍歷所有月份從gv.firstDategv.lastDate,並獲得該月份內的所有Email

有誰知道使用Joda-Time做這件事的好方法嗎?

編輯:

有了它,這將是偉大的結合,所以現在從日期TreeMap的電子郵件得到。

for(int y = 2004; y < 2011; y++) { 
     for(int m = 0; m < 12; m++) { 
      // get all of that month 
     } 
    } 

回答

2

由於使用的是一個TreeMap可以使用方法http://docs.oracle.com/javase/6/docs/api/java/util/NavigableMap.html#subMap%28K,%20boolean,%20K,%20boolean%29

NavigableMap<K,V> subMap(K fromKey, 
         boolean fromInclusive, 
         K toKey, 
         boolean toInclusive) 

返回此映射,其鍵範圍從fromKey到toKey的所述部分的視圖。

如果定義間隔的鍵不保證在地圖上,你可以通過做

for(List<Email> emails : dates.tailMap(gv.firstDate).headMap(gv.lastDate).values()) { 
    for(Email email : emails) { 
     // do something 
    } 
} 
+0

我不TH墨水這回答了這個問題。 – 2012-01-05 22:22:01

+0

這取決於數據集。如果間隔並不總是與現有的鍵相對應,則可以使用headMap和tailMap方法。 – Guillaume 2012-01-05 22:26:19

+2

我認爲這將不起作用,因爲'gv.firstDate'和'gv.lastDate'可能不存在於這組鍵中。 – Behrang 2012-01-05 22:33:00

3

你可以做一些類似的獲得僅包含您想要的值地圖:

for (Map.Entry<LocalDate, ArrayList<Email>> entry : dates) { 
    if (entry.getKey().isBefore(gv.firstDate())) { 
     continue; 
    } 

    if (entry.getKey().isAfter(gv.lastDate())) { 
     break; 
    } 

    // process the emails 
    processEmails(entry.getValue()); 
} 

如果你必須使用谷歌番石榴的自由,你可以做這樣的事情:

Map<LocalDate, ArrayList<Email>> filteredDates = Maps.filterKeys(dates, new Predicate<LocalDate>() { 
    public boolean apply(LocalDate key) { 
     if (entry.getKey().isBefore(gv.firstDate())) { 
      return false; 
     } 

     if (entry.getKey().isAfter(gv.lastDate())) { 
      return false; 
     } 

     return true; 
    } 
}); 

// process the emails 
processEmails(filteredDates); 
+1

考慮創建一個子地圖(或tailMap/headMap),最終使用ceilingKey/floorKey方法獲取該地圖區間內的按鍵。它將通過利用TreeMap特有的功能避免在每個映射條目上迭代。 – Guillaume 2012-01-05 22:46:49

+0

謝謝,番石榴的方式看起來很有希望。我只收到一堆錯誤,其中一個是void無法返回值。 也不應該有一個processEmails函數?我怎麼能給第一次和最後一次約會? gv.firstDate就像2004年的某個地方,而2011年的gv.lastDate在某個地方,我仍然需要每個月輪流投擲一次。 – clankill3r 2012-01-05 23:26:38

+0

@ clankill3r我認爲使用'headMap'和'tailMap'的Guillaume解決方案更有意義:它更簡潔,應該更快。關於無效錯誤,這是我的錯誤。 'apply'函數應該返回'boolean'。你應該自己寫processEmail。 – Behrang 2012-01-06 07:49:42