在我在一段时间内几乎不得不在几天之间循环之前,我使用了这样的循环:
for(LocalDate iDate = gv.firstDate; iDate.isBefore(gv.lastDate); iDate = iDate.plusDays(1)) {
...
}
现在我有TreeMap
这样:
TreeMap<LocalDate, ArrayList<Email>> dates;
我希望将所有月份从gv.firstDate
循环到gv.lastDate
并获取该月内的所有Email
。
有没有人知道使用Joda-Time做到这一点的好方法?
编辑:
将它与此相结合将会很棒,所以现在可以从日期TreeMap的电子邮件中获取。
for(int y = 2004; y < 2011; y++) {
for(int m = 0; m < 12; m++) {
// get all of that month
}
}
答案 0 :(得分: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());
}
如果您可以自由使用Google Guava,则可以执行以下操作:
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 :(得分: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
}
}