我的Java例程应该从一个String
中找到ArrayList
作为另一个char
ArrayList
的{{1}}序列。
如果我从目标String
中的来源String
搜索ArrayList
项,那么它就有效。
如果目标ArrayList
项具有更多字母数字文字,我尝试使用ArrayList
序列找到所需部分。
单词中的简短示例:
ArrayList_A项目:" A0B"," C1D"," E2F"
ArrayList_B项目:" A0B"
结果:在char
项目(工作)中找到项目B
ArrayList_A项目:" A0B / C1D"," E2F"
ArrayList_B项目:" A0B"
结果:在ArrayList_A
项目中找到了项目B(这是我想要的其他内容)
以下是我部分工作的代码。任何人都可以修复它,以便我可以从解决方案中学习?
ArrayList_A
答案 0 :(得分:3)
首先,您应该使用功能样式编程。 forEach()不允许你超过(...)
的标准完全匹配
ArrayList<String> arrayListFound = arrayListB.stream()
.filter(arrayListA::contains)
.collect(Collectors.toList());
用于子串匹配
ArrayList<String> arrayListFound = arrayListB.stream()
.filter(itemB -> arrayListA.stream()
.matchAny(itemA -> itemA.contains(itemB))
)
.collect(Collectors.toList());
答案 1 :(得分:2)
您可以对这两个集合进行流式处理,并使用String#contains
代替List#contains
。
它会将String
中包含的B
的所有相应A
个对象添加到arrayListFound
arrayListB.stream().forEach(b ->
arrayListA.stream().forEach(a -> {
if (a.contains(b)){
arrayListFound.add(b);
}
}
));
答案 2 :(得分:0)
if(arrayListA.contains((CharSequence)searchStr)){
System.out.print(" - found!" );
arrayListFound.add((String) searchStr);
}
此代码段显示,&#34;如果我的列表中包含此字符串,则会找到&#34;。但您的字符串A0B
与A0B/C1D
不同。迭代这两个列表并检查contains
的{{1}}方法,而不是String
,我们会找到您需要的内容。 E.g:
ArrayList
答案 3 :(得分:0)
仅稍微修改您的实现的替代解决方案如下。
arrayListB.stream().forEach((searchStr) -> {
if(arrayListA.stream().anyMatch(str -> str.contains((CharSequence)searchStr))){
System.out.print(" - found!" );
arrayListFound.add((String) searchStr);
}
else {
System.out.print(" - not found");
}
});
我。我们可以使用效果优于anyMatch
的{{1}}。
II。这里我们检查foreach
中是否存在任何字符串,该字符串会将arrayListA
的searchStr作为子字符串。
要在不改变arrayListB
列表的情况下以纯函数方式执行此操作,可以采用以下方法:
arrayListFound