向前看下一个地图条目

时间:2017-07-31 19:24:53

标签: java loops dictionary treemap

我的数据集是一个包含截止日期和金额的付款计划。我将其存储在TreeMap

Map<LocalDate, BigDecimal> paymentSchedule = new TreeMap<>();
paymentSchedule.put(LocalDate.parse("2017-01-01", formatter), new BigDecimal("1000"));
paymentSchedule.put(LocalDate.parse("2017-02-01", formatter), new BigDecimal("1000"));
paymentSchedule.put(LocalDate.parse("2017-03-01", formatter), new BigDecimal("1000"));
paymentSchedule.put(LocalDate.parse("2017-04-01", formatter), new BigDecimal("1000"));
paymentSchedule.put(LocalDate.parse("2017-05-01", formatter), new BigDecimal("1000"));
paymentSchedule.put(LocalDate.parse("2017-06-01", formatter), new BigDecimal("1000"));

for (Map.Entry<LocalDate, BigDecimal> paymentPeriod : paymentSchedule.entrySet()) {
    LocalDate dueDate = paymentPeriod.getKey();
    BigDecimal amountDue = paymentPeriod.getValue();
}

我怎样才能提前躲避&#34;在迭代期间没有推进迭代?

例如,当我使用{2017-03-01,1000}的Map.Entry时,我想查找计算的下一个截止日期。

1 个答案:

答案 0 :(得分:0)

不使用任何外部库,您只需从List创建entrySet并使用旧式for-for-index循环遍历列表:

final List<Map.Entry<LocalDate, BigDecimal>> entryList = new ArrayList<>(paymentSchedule.entrySet());
for (int i = 0; i < entryList.size(); i++) {
    Map.Entry<LocalDate, BigDecimal> paymentPeriod = entryList.get(i);
    if (i < entryList.size() - 1) {
        Map.Entry<LocalDate, BigDecimal> nextPaymentPeriod = entryList.get(i + 1);
    }
    LocalDate dueDate = paymentPeriod.getKey();
    BigDecimal amountDue = paymentPeriod.getValue();
}

根据地图的大小,此方法会产生更好的效果,因为下一个条目的查找为O(1)List的创建为O(n)会导致整体复杂化O(n)NavigableMap.higherKey()函数为O(log(n))的位置导致O(n log(n))的总复杂度。