我的数据集是一个包含截止日期和金额的付款计划。我将其存储在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时,我想查找计算的下一个截止日期。
答案 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))
的总复杂度。