gpt4 book ai didi

java - 收集到 Multimap 并保留顺序

转载 作者:行者123 更新时间:2023-12-04 10:51:03 24 4
gpt4 key购买 nike

我有一个属性列表,如 attr1 , attr2等。我还有一个函数,它接受一个属性并返回一个前缀列表。


private List<String> getAttributePrefixes(String attribute) {
//get prefix for attribute
}


我想创建一个映射,其键是前缀,值是属性。由于前缀可以重复,我想将结果输出为多图。

因此,对于上面的示例,输出 Multimap 将如下所示:
{ 
a = [attr1, attr2],
at = [attr1, attr2],
att = [attr1, attr2],
attr = [attr1, attr2],
attr1 = [attr1],
attr2 = [attr2]
}

我的代码的问题是订单没有保留。例如,我的 map 中的条目如下所示:

a = attr2, attr1 (I call getAttributePrefixes function first for attr1 and then attr2)

我要 attr1先来然后 attr2 .这是我的代码:

Multimap<String, String> multimap = attributes.stream()
.map(attribute -> new AbstractMap.SimpleEntry<>(attribute, getAttributePrefixes(attribute)))
.flatMap(entry -> entry.getValue()
.stream()
.map(prefix -> new AbstractMap.SimpleEntry<>(prefix, entry.getKey())))
.collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getKey, Map.Entry::getValue));

最佳答案

主要问题是stream通常不会提供很少的排序保证,因为它是在考虑并行执行的情况下创建的。一种简单的选择是尝试 jOOλ 作为为单线程执行而实现的替代品。它还有一个不错的 groupBy您的用例的方法。

如果这不是一个选项/工作,您必须手动执行分组以获得您的订购。

    Map<String, List<String>> multimap = attributes.stream()
.map(attribute -> new AbstractMap.SimpleEntry<>(attribute, getAttributePrefixes(attribute)))
.flatMap(entry -> entry.getValue()
.stream()
.map(prefix -> new AbstractMap.SimpleEntry<>(prefix, entry.getKey())))
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
groupingBy是一个非并行收集器,所以它应该可以工作。不过,您需要将给定的 map 包装到多 map 中。

关于java - 收集到 Multimap 并保留顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59473069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com