gpt4 book ai didi

Java 8 - 从列表中删除重复的元素序列

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:20 27 4
gpt4 key购买 nike

我有一个要求,我想使用 Java Stream Api 来处理来自系统的事件流,并应用数据清理过程来删除重复的事件。这是删除按顺序重复多次的同一事件,而不是创建不同事件的列表。大多数在线可用的 Java Stream api 示例都旨在从给定输入创建不同的输出。

例如,对于输入流

[a, b, c, a, a, a, a, d, d, d, c, c, e, e, e, e, e, e, f, f, f]

输出的List或Stream应该是

[a, b, c, a, d, c, e, f]

我当前的实现(不使用 Stream api)看起来像

public class Test {
public static void main(String[] args) {
String fileName = "src/main/resources/test.log";
try {
List<String> list = Files.readAllLines(Paths.get(fileName));
LinkedList<String> acc = new LinkedList<>();

for (String line: list) {
if (acc.isEmpty())
acc.add(line);
else if (! line.equals(acc.getLast()) )
acc.add(line);
}

System.out.println(list);
System.out.println(acc);

} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

输出,

[a, b, c, a, a, a, a, d, d, d, c, c, e, e, e, e, e, e, f, f, f]
[a, b, c, a, d, c, e, f]

我尝试了各种使用 reduce、groupingBy 等的示例,但都没有成功。如果有这种可能性,我似乎无法找到一种方法将流与我的累加器中的最后一个元素进行比较。

最佳答案

您可以使用 IntStream获取 List 中的索引位置并将其用于您的优势,如下所示:

List<String> acc = IntStream
.range(0, list.size())
.filter(i -> ((i < list.size() - 1 && !list.get(i).equals(list
.get(i + 1))) || i == list.size() - 1))
.mapToObj(i -> list.get(i)).collect(Collectors.toList());
System.out.println(acc);

解释

  1. IntStream.range(0,list.size()) : 返回原始 int 值元素的序列,这些元素将用作访问列表的索引位置。
  2. filter(i -> ((i < list.size() - 1 && !list.get(i).equals(list.get(i + 1) || i == list.size() - 1)) : 仅当当前索引位置的元素不等于下一个索引位置的元素或到达最后一个索引位置时才继续
  3. mapToObj(i -> list.get(i) : 将流转换为 Stream<String> .
  4. collect(Collectors.toList()) : 将结果收集到列表中。

关于Java 8 - 从列表中删除重复的元素序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675376/

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