gpt4 book ai didi

Java 集合 pack() 方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:58 25 4
gpt4 key购买 nike

使用 Java 流实现集合的 pack() 操作的好方法是什么?这是我想要完成的:

List<String> items = Arrays.asList("A", "A", "B", "B", "A", "C", "C", "A", "A", "A");
List<List<String>> packs = items.stream().pack();
// packs: [[A,A],[B,B],[A],[C,C],[A,A,A]]

或者,打包操作可以返回 (index, element, count) 形式的元组列表:

[(0, A, 2), (2, B, 2), (4, A, 1), (5, C, 2), (7, A, 3)]

目前,我通过以下方式使用可变累加器实现了这一点:

Packer<String> packer = new Packer<>();
items.stream().forEach(packer);
List<Triple<Integer, T, Integer>> packs = packer.get();

public class Packer<T> implements Consumer<T>, Supplier<List<Triple<Integer, T, Integer>>>
{
private List<Triple<Integer, T, AtomicInteger>> result = new ArrayList<>();
private Optional<Triple<Integer, T, AtomicInteger>> currentElement = Optional.empty();
private int count = 0;

@Override
public void accept(T t)
{
if (currentElement.isPresent() && currentElement.get().getMiddle().equals(t))
{
currentElement.get().getRight().incrementAndGet();
}
else
{
currentElement = Optional.of(Triple.of(count, t, new AtomicInteger(1)));
result.add(currentElement.get());
}
count++;
}

@Override
public List<Triple<Integer, T, Integer>> get()
{
return result.stream().map(x -> Triple.of(x.getLeft(), x.getMiddle(), x.getRight().get())).collect(Collectors.toList());
}

}

最佳答案

您可以使用 StreamEx 折叠相邻元素:

List<List<String>> packs = StreamEx.of(items)
.collapse(Object::equals, Collectors.toList())
.collect(Collectors.toList());

输出:

[[A, A], [B, B], [A], [C, C], [A, A, A]]

JDoodle Demo

我不确定 StreamEx 是否支持索引折叠。

关于Java 集合 pack() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45473229/

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