我已经定义了一个如下所示的列表
List<String> list = List.of("val1", "val2", "val3");
现在我有以下字符串
String myStr = "rel1,wel12,val1";
现在我需要检查字符串是否有列表中的任何一个元素(在上面的例子中它是真的,因为它有val1
,接下来是将该值放入一个变量中
我已经尝试了下面的方法并且它有效,但我相信有更好的方法可以使用任何集合库来做到这一点
List<String> list = List.of("val1", "val2", "val3");
String myStr = "rel1,wel12,val1";
String matchedStr =StringUtils.EMPTY;
String[] vals = myStr.split(",");
for(String val:vals) {
if(list.contains(val){
matchedStr=val;
break;
}
}
答案 0 :(得分:1)
您可以使用 Java Streams 获取第一个匹配的字符串:
Optional<String> result = Stream.of(vals).filter(list::contains).findFirst();
答案 1 :(得分:0)
根据问题域中的可能值,可能不需要拆分输入字符串。只需拨打 String#contains
。
如果是这样,你可以翻转你的逻辑。不是在分割部分上循环,而是在字符串的目标列表上循环。对于列表中的每个字符串,询问未处理的输入字符串是否包含该元素。如果是,请跳出循环。
提示:如果此代码位于返回字符串的方法中,并且在未找到匹配项时返回 null,请了解如何返回 Optional
。
答案 2 :(得分:0)
如果列表不是太大,你的方式没问题。我也将字符串视为一个列表,因为它可以像您已经完成的那样通过拆分来制作一个列表。您可以从较大的集合中创建一个集合,然后在较小的集合上进行迭代。
另一种方法是找到两个列表的交集。
List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");
现在我们可以找到交点了:
Set<String> result = list.stream()
.distinct()
.filter(otherList::contains)
.collect(Collectors.toSet());
result
应包含“红色”和“绿色”。
答案 3 :(得分:0)
我更喜欢 Zobayer 的回答,或者使用 List#retainAll
。
<input>
final List<String> first = List.of("one", "two", "three");
final List<String> out = new ArrayList<>(Arrays.asList("five,four,three".split(",")));
out.retainAll(first);
包含单个条目 out
。