java按时间范围过滤_java – 按日期的最大值过滤日期的TreeMap

可能的解决方案如下:

>在地图中的所有条目上创建一个Stream

>将Stream收集到一个新Map中,其中键对应于Map的year-month部分,值为当前条目.如果是重复,则仅保留与日期有关的最大元素

>再次对该中间Map的值创建一个新的Stream

>并最终将其收集到TreeMap中.

假设初始Map的类型为TreeMap< LocalDate,Double>,这将是一个实现(此代码使用来自Collectors类的静态导入):

TreeMap filtered =

map.entrySet()

.stream()

.collect(groupingBy(

e -> YearMonth.from(e.getKey()),

collectingAndThen(maxBy(Map.Entry.comparingByKey()), Optional::get))

)

.values()

.stream()

.collect(toMap(

Map.Entry::getKey,

Map.Entry::getValue,

(v1, v2) -> { throw new IllegalStateException(); },

TreeMap::new)

);

在此代码中,地图首先使用Collectors.groupingBy(classifier, downstream)按年 – 月分组.分类器从LocalDate返回YearMonth对象.下游收集器用于将具有相同年月的所有值收集到单个值中:在这种情况下,我们使用Collectors.maxBy(comparator)根据比较器比较每个条目LocalDate键(comparingByKey)来选择最大值.由于此收集器返回一个Optional(如果Stream为空),我们将其包装到Collectors.collectingAndThen(downstream, finisher)中,其中finisher只返回可选值.因此,在此步骤结束时,我们有一个Map< YearMonth,Map.Entry< LocalDate,Double>>.

最后,我们保留这个中间映射的values以将每个条目收集到一个新的Map中,在那里我们显式创建一个TreeMap.由于我们知道这里没有重复项,因此合并函数只会抛出IllegalStateException.

样本输入/输出:

2010-01-01=2100.00

2010-01-02=2108.74

2010-02-01=2208.74

2010-02-02=2217.92

2010-03-01=2317.92

2010-03-02=2327.57

2010-04-01=2427.57

– >

2010-01-02=2108.74

2010-02-02=2217.92

2010-03-02=2327.57

2010-04-01=2427.57

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值