如何从地图中查找绘制中每个数字的最新日期 >

问题描述 投票:3回答:2

假设我有一个Map<Date, List<Integer>>,其中整数列表只是彩票抽奖中的数字列表。它可能看起来像这样:

Wed Nov 15 13:31:45 EST 2017=[1, 2, 3, 4, 5, 6], 
Wed Nov 22 13:31:45 EST 2017=[7, 8, 9, 10, 11, 12], 
Wed Nov 29 13:31:45 EST 2017=[13, 14, 15, 16, 17, 18], 
Wed Dec 13 13:31:45 EST 2017=[1, 19, 20, 21, 22, 23], 
Wed Dec 20 13:31:45 EST 2017=[24, 25, 26, 27, 28, 29]

我需要将该地图转换为地图,其中key是彩票号码,值是投掷号码的最后日期。类似于:1 = Wed 12月13日13:31:45 EST 2017 2 = Wed Nov 15 13:31:45 EST等等到49。

所以,问题是:是否有可能使用Java 8流,如果是,那么如何。

提前致谢。

java-8 java-stream
2个回答
3
投票

如果我没有弄错你正在寻找这样的东西(假设DateComparable):

map.entrySet()
            .stream()
            .flatMap(x -> x.getValue().stream().map(y -> new AbstractMap.SimpleEntry<>(x.getKey(), y)))
            .collect(Collectors.groupingBy(
                    Entry::getValue,
                    Collectors.collectingAndThen(
                            Collectors.maxBy(Comparator.comparing(Entry::getKey)),
                            x -> x.get().getKey())));

1
投票

这里有一个简洁的方法(没有溪流):

Map<Integer, Date> result = new HashMap<>();
map.forEach((date, list) -> list.forEach(n -> result.merge(n, date, 
    (oldDate, newDate) -> newDate.after(oldDate) ? newDate : oldDate)));

这将迭代map地图,并且对于每个(date, list)对,它迭代list数字列表。然后它使用Map.mergeDate.after方法将条目放入result地图,使得只有最后一个日期映射到给定数字。

© www.soinside.com 2019 - 2024. All rights reserved.