Как пройти через месяцы, используя Joda-Time? - PullRequest
0 голосов
/ 06 января 2012

Раньше мне в основном приходилось делать циклы между днями в определенном периоде, и я использовал такие циклы:

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 ]

3 голосов
/ 06 января 2012

Вы можете сделать что-то похожее на это:

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);
2 голосов
/ 06 января 2012

Поскольку вы используете 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
   }
}
...