Buc*_*uck 5 java collections java-stream
pack()使用Java流实现集合操作的好方法是什么?这是我想要完成的事情:
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]]
Run Code Online (Sandbox Code Playgroud)
或者,pack操作可以以(index,element,count)的形式返回元组列表:
[(0, A, 2), (2, B, 2), (4, A, 1), (5, C, 2), (7, A, 3)]
Run Code Online (Sandbox Code Playgroud)
目前我使用可变累加器以下列方式实现了这个:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用StreamEx折叠相邻元素:
List<List<String>> packs = StreamEx.of(items)
.collapse(Object::equals, Collectors.toList())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
输出:
[[A, A], [B, B], [A], [C, C], [A, A, A]]
Run Code Online (Sandbox Code Playgroud)
我不确定 StreamEx 是否支持索引折叠。
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |