如何使用Joda-Time循环数月?

时间:2012-01-05 22:11:22

标签: java loops jodatime treemap

在我在一段时间内几乎不得不在几天之间循环之前,我使用了这样的循环:

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
        }
    }

2 个答案:

答案 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
   }
}