使用Guava的ImmutableSortedMap作为频率图
Use Guava's ImmutableSortedMap as a frequency map
当我想创建频率图时,我无法理解如何使用 ImmutableSortedMap.toImmutableSortedMap()
。我知道 Multiset
(),但这次我不想使用它,因为它需要我编写自定义序列化程序来创建适用于的 json 表示消费者表示 json。
下面的代码有效,即它创建了所需的频率映射,按键按升序排序,但它使用了一个临时映射,然后我用它来创建 ImmutableSortedMap
。 我想摆脱临时地图。我尝试在这种情况下使用 toImmutableSortedMap()
收集器方法,但未能生成甚至可以编译的代码...
我正在使用 Java 8 和 Guava 版本 28.1
@Test
public void test() {
Map<String, Long> intermediateMap = Stream.of("b", "a", "c", "b")
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
ImmutableSortedMap<String, Long> desiredMap = ImmutableSortedMap.copyOf(intermediateMap);
System.out.println(desiredMap); // Outputs {a=1, b=2, c=1}, which is the desired state
}
Map<String, Long> result =
Stream.of("b", "a", "c", "b")
.collect(ImmutableSortedMap.toImmutableSortedMap(
Comparator.naturalOrder(),
Function.identity(),
x -> 1L,
Long::sum
));
您甚至可以在不使用 Guava 的情况下实现类似的功能(不可修改、排序 Map
)。
Map<String, Long> immutableSortedMap = Stream.of("b", "a", "c", "b")
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()),
Collections::unmodifiableMap)
);
- 使用
TreeMap
实现排序(自然顺序)
- 使用
Collectors::collectingAndThen
将结果包装在不可修改的映射中
当我想创建频率图时,我无法理解如何使用 ImmutableSortedMap.toImmutableSortedMap()
。我知道 Multiset
(
下面的代码有效,即它创建了所需的频率映射,按键按升序排序,但它使用了一个临时映射,然后我用它来创建 ImmutableSortedMap
。 我想摆脱临时地图。我尝试在这种情况下使用 toImmutableSortedMap()
收集器方法,但未能生成甚至可以编译的代码...
我正在使用 Java 8 和 Guava 版本 28.1
@Test
public void test() {
Map<String, Long> intermediateMap = Stream.of("b", "a", "c", "b")
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
ImmutableSortedMap<String, Long> desiredMap = ImmutableSortedMap.copyOf(intermediateMap);
System.out.println(desiredMap); // Outputs {a=1, b=2, c=1}, which is the desired state
}
Map<String, Long> result =
Stream.of("b", "a", "c", "b")
.collect(ImmutableSortedMap.toImmutableSortedMap(
Comparator.naturalOrder(),
Function.identity(),
x -> 1L,
Long::sum
));
您甚至可以在不使用 Guava 的情况下实现类似的功能(不可修改、排序 Map
)。
Map<String, Long> immutableSortedMap = Stream.of("b", "a", "c", "b")
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()),
Collections::unmodifiableMap)
);
- 使用
TreeMap
实现排序(自然顺序) - 使用
Collectors::collectingAndThen
将结果包装在不可修改的映射中