说我有一个像这样的字符串数组:
0 ["Some plain text"]
1 ["Foobar chicken"]
我想在每个String(在数组的每个索引中)搜索特定的子字符串,比如plain
,然后在找到子字符串的第一个实例时返回true
。
最有效的方法是什么?
我知道我可以在for循环中做一个简单的break
,但我听说有人说在for循环中使用break
是不好的做法。我也听说使用while
和do-while
也不好。
这是我使用break的简单实现:
for (String[] index : tmpList) {
retVal = index[2].toLowerCase().contains(keyword);
if (retVal) // Break when retVal is true
break;
}
其中:
tmpList
是ArrayList<String[]>
keyword
正是我想要找到的答案 0 :(得分:6)
你在哪里找到这个?那是完全错误的。 Is it a bad practice to use break in a for loop?我知道我可以在for循环中做一个简单的休息,但我听到有人说 在for循环中使用break是不好的做法。
只需使用for循环并循环遍历String
。使用String#contains
检查String
是否有特定的子字符串。然后将String
存储在变量(或索引,如果需要)和break;
中。
答案 1 :(得分:0)
我知道apache-commons有一个名为StringUtils的实用程序类,它可以为您提供一个优雅的解决方案。
public boolean foo(String[] array, String pattern){
for(String content : array){
if(StringUtils.contains(content, pattern){
return true;
}
}
return false;
}
我不喜欢这样的一件事是它只会在第一个找到的实例返回true。我不完全确定你要做什么,但如果不这样做,如果不关心数组中与模式不匹配的索引,我建议使用名为filter的高阶函数。
Guava,lambdaJ和Apache-Commons是支持函数式编程的库。
下面是一些应该在Apache-Commons中运行的sudo代码。
List<String> content = Arrays.asList(strArray);
Predicate matchesPattern = new Predicate("asdf"){{
private String pattern;
public Predicate(String pattern){
this.pattern = pattern;
}
@Overload
public boolean evaluate(Object input){
if(input instanceOf String){
StringUtils.contains((String)input, pattern
}
return false;
}
}};
CollectionUtils.filter(content, matchesPattern);
这样做是从列表中删除与模式不匹配的任何String。正如你所看到的,它是一个有点冗长的声明一个Predicate对象。如果您使用Apache-Commons或Guava,它看起来会很相似,但这就是lambdaJ拯救的地方。
谓词就是函数的术语,它接受一个参数并返回一个布尔值,你可能以前在Matcher类中使用过它们。 Hamcrest有一些最好的Matcher库,所以lambdaJ只是围绕它构建了一个函数式编程库。它易于使用且具有高可读性。