Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i check a condition in takeWhile if condition depends on current value and previous value?

I have a arrayList as follows:

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

The above array means that from 0 to 12 hours before departure, a cancellation charge of 20% is applicable. From 12 hours to 48 hours before departure, a cancellation charge of 10% is applicable and beyond 48 hours, there is not cancellation charge at all.

I want to filter the above to find out the cancellation charges which are applicable beyond a day. i.e., in the above case, the result should be

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

I tried to filter by condition hours >= 24 and if the last element does not have hours as 24, I iterated again to find the first element with hours < 24. Is there a better way to solve this. I am using java12.

like image 260
Deepa Sajani Jeyaraj Avatar asked Sep 16 '25 07:09

Deepa Sajani Jeyaraj


1 Answers

You just need to keep track of the last "hours" value you've seen. Remember that the Predicate that you pass to to takeWhile is an object, so you can keep state inside of it. It would look something like this:

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;
    }
});
like image 102
Willis Blackburn Avatar answered Sep 19 '25 16:09

Willis Blackburn