给出这样一张Map,我们有一年中每周每天的频率计数:
Map.of(
DayOfWeek.MONDAY , 52 ,
DayOfWeek.TUESDAY , 52 ,
DayOfWeek.WEDNESDAY, 53 ,
DayOfWeek.THURSDAY , 53 ,
DayOfWeek.FRIDAY , 52 ,
DayOfWeek.SATURDAY , 52 ,
DayOfWeek.SUNDAY , 52
)
…或作为文本:
{星期一=52,星期二=52,星期三=53,星期四=53,星期五=52,星期六=52,星期日=52}
…如何反转以生成一个不同编号的多重Map,每个编号指向一个集合(列表?套?) DayOfWeek
谁拥有那个号码?
结果应与此代码的结果相等:
Map.of(
53 , List.of( DayOfWeek.WEDNESDAY , DayOfWeek.THURSDAY ) ,
52 , List.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.FRIDAY , DayOfWeek.SATURDAY , DayOfWeek.SUNDAY )
)
我想使用纯java生成结果multimap,而不需要额外的库,比如eclipse集合或google guava。这些库可能会使这更容易,但我很好奇,看看是否一个解决方案只使用内置java是可能的。否则,我这里的问题和guava完全一样:通过反转一个Map来构造一个多重Map。考虑到现代java中新的流和多Map特性,我希望这现在是可能的,而那时不是。
我看到了很多类似的问题。但没有一个符合我的情况,这似乎是一个相当普遍的情况。例如,这个问题忽略了原始值是冗余/多重的问题,因此需要一个多重Map。其他像这样或这样涉及谷歌Guava。
4条答案
按热度按时间shstlldc1#
请参考以下代码:
oknrviil2#
以下是使用java 9或更高版本的作品:
如果您愿意使用第三方库,则以下代码将适用于eclipse集合:
注意:我是eclipse集合的提交者。
cbeh67ev3#
收集器.tomap
在这种情况下,您可以使用
Collectors.toMap(keyMapper,valueMapper,mergeFunction)
并生成多重Map,其中值可以是列表或集合:多重Map值是
List
:多重Map值是
Set
:另请参见:基于多个字段收集ID列表
zujrkrfu4#
使用streams,可以将Map拆分为其条目,然后翻转条目并分组:
根据你的最新评论要求优化,而不是你原来的问题,