Как проверить условие в takeWhile, если условие зависит от текущего значения и предыдущего значения? - PullRequest
3 голосов
/ 04 октября 2019

У меня есть arrayList следующим образом:

[{hours: 48, cancellationCharges: 0}, 
 {hours: 12, cancellationCharges: 10}, 
 {hours: 0, cancellationCharges: 20}]

Приведенный выше массив означает, что за 0–12 часов до отправления взимается штраф в размере 20%. За 12 часов и 48 часов до вылета взимается плата за отмену бронирования в размере 10%, а после 48 часов плата за отмену не взимается вообще.

Я хочу отфильтровать вышеперечисленное, чтобы выяснить, какие сборы за отмену применяются за пределами дня. то есть, в приведенном выше случае, результат должен быть

[{hours: 48, cancellationCharges: 0}, 
 {hours: 12, cancellationCharges: 10}]

Я попытался отфильтровать по условию часы> = 24, и если последний элемент не имеет часов, как 24, я повторил еще раз, чтобы найти первый элементс часами <24. Есть лучший способ решить это. Я использую java12. </p>

1 Ответ

3 голосов
/ 04 октября 2019

Вам просто нужно следить за последним значением "часов", которое вы видели. Помните, что Predicate, который вы передаете takeWhile, является объектом, так что вы можете сохранять состояние внутри него. Это будет выглядеть примерно так:

cancellationRules.takeWhile(new Predicate<CancellationRule> {
    private int previousHours = Integer.MAX_VALUE;
    public boolean test(CancellationRule rule) {
        boolean result = rule.hours >= 24 || previousHours >= 24;
        previousHours = rule.hours;
        return result;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...