如何从字符串中过滤出唯一的元素并将它们存储到ArrayList中



给定一个过滤字符串。我想把它的子字符串添加到一个ArrayList,只有当它不包含它。

我的代码:

Pattern reg = Pattern.compile(",");
ArrayList<String> SANR = reg.splitAsStream(joiner.toString())    
.filter(role -> role.contains("ABB"))
.map(str -> str.replaceAll("ABB", ""))
.collect(Collectors.toCollection(ArrayList::new));

作为输入,它获得附加ABB的所有值,例如[123,123,244,244,255],因此我想确保输出只是:

[123,244,255]

您需要应用distinct()操作来确保结果不包含重复项。为了实现它并保持流中元素的初始顺序,它在底层使用了LinkedHashSet

不要使用ArrayList作为类型,这会使你的代码僵化。参见"编程到接口"是什么意思?

顺便说一下,Collectors.toList()以及Java 16toList()操作实际上会给你一个ArrayList,但你的代码不应该依赖于它。如果将来会设计一个更好的通用List接口实现,它将能够实现ArrayList所做的一切,如果您不特别要求ArrayList,您将免费获得它。根据接口编写代码。
Pattern reg = Pattern.compile(",");
List<String> sanr = reg.splitAsStream(joiner.toString())
.filter(role -> role.contains("ABB"))
.map(str -> str.replaceAll("ABB" , ""))
.distinct()
.collect(Collectors.toList());

旁注:按照惯例,常量字段(即标记为final)应使用大写名称,对于局部值应使用以小写字母开头的驼峰大小写。名字本身应该是有意义的,如果sanr是某种缩写,它应该被记录在某个地方。

如果它适合您的用例,我建议使用Set抽象数据类型而不是ArrayList。它允许你不在字符串列表中存储任何重复项。

查看:Java集合

如果你想把它保存为数组列表,你可以这样做:

myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));

从"myArrayList"中删除任何重复项

最新更新