gpt4 book ai didi

java - 使用 Java 8 Stream API 计算连续相同对象的数量

转载 作者:行者123 更新时间:2023-11-30 10:14:03 27 4
gpt4 key购买 nike

我想用 Java 8 流逐个统计相同对象的数量。我怎么做?如果我有一个列表

3, 3, 5, 5, 5, 6, 3, 3

我想要的结果是

[3-2] [5-3] [6-1] [3-2]

我天真的尝试没有 Java 8 流:

private static List<ValueCount> counteSameValueInRow(List<Integer> Values) {
List<ValueCount> result = new ArrayList<ValueCount>();
ValueCount valueCount = null;

for (int value: Values) {
if (valueCount == null) {
valueCount = new ValueCount(value);
} else if (valueCount.value == value){
valueCount.numberof++;
} else {
result.add(valueCount);
valueCount = new ValueCount(value);
}
}
result.add(valueCount);
return result;
}

最佳答案

您所做的相当于流中的collect。您正在获取每个数字并将其汇总到“组”列表中。 Collectors.groupingBy() 浮现在脑海中,但这会将整个列表中的数字分组,即只计算每个数字的出现次数。使用 Stream.collect(Supplier, BiConsumer, BiConsumer) 方法实现自定义收集,您可以这样做:

List<Integer> values = Arrays.asList(3, 3, 5, 5, 5, 6, 3, 3);

values.stream().collect(LinkedList<List<Integer>>::new, (list, value) -> {
if (list.isEmpty() || !list.getLast().get(0).equals(value))
{
list.add(new ArrayList<>());
}
list.getLast().add(value);
}, (list1, list2) -> {
if (list1.getLast().get(0).equals(list2.getFirst().get(0)))
{
list1.getLast().addAll(list2.getFirst());
list2.removeFirst();
}
list1.addAll(list2);
}).forEach(group -> System.out.println("[" + group.get(0) + "-" + group.size() + "]"));

请注意,我使用 ArrayList 来收集重复项。为此,您可以使用 ValueCount 类,这可能会使其更具可读性。

本例中的流并没有提高代码的可读性,而是启用了并行处理。看collect方法的第三个参数。如果流是并行处理的,那么它会结合两个中间结果。

要并行尝试,将 stream() 替换为 parallelStream() 并在第三个参数的 lambda 中放置一个 sysout 以查看何时合并两个中间结果。请注意,只有当您的列表非常大时,并行处理才会对您有利。

关于java - 使用 Java 8 Stream API 计算连续相同对象的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51058350/

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