BufferedReader in = null;
Set<String> words = ... // construct this as per above
try {
in = ...
while ((String line = in.readLine()) != null) {
for (String word : words) {
if (line.contains(word)) [
// do whatever
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) { try { in.close(); } catch (Exception e) { } }
}
3条答案
按热度按时间64jmpszr1#
这取决于什么
stringArray
是。如果它是一个Collection
那好吧。如果它是真数组,你应该把它变成Collection
. 这个Collection
接口有一个名为contains()
这将决定Object
是在Collection
.将数组转换为
Collection
:问题在于
List
查找是昂贵的(技术上是线性的还是线性的)O(n)
). 更好的办法是使用Set
,这是无序的,但有接近常数(O(1)
)查找。可以这样构造:从
Collection
:从阵列:
然后
set.contains(line)
将是一个廉价的操作。编辑:好吧,我觉得你的问题不清楚。您需要查看该行是否包含数组中的任何单词。你想要的是这样的:
这是一个相当粗糙的检查,这是使用出人意料的开放,往往会给恼人的假阳性词,如“废品”。对于更复杂的解决方案,您可能必须使用正则表达式并查找单词边界:
您可能希望更有效地完成这项工作(比如不要用每行编译模式),但这是要使用的基本工具。
ux6nzvsh2#
将所有值复制到
Set<String>
然后使用contains()
:[编辑]如果要确定行的一部分是否包含集合中的字符串,则必须在集合上循环。替换
set.contains(line)
打电话给:当使用regexp或更复杂的方法进行匹配时,相应地调整检查。
[edit2]第三个选项是将数组中的元素串联在一个巨大的regexp中
|
:如果数组中有许多元素,这可能会更便宜,因为regexp代码将优化匹配过程。
qnyhuwrf3#
使用
String.matches(regex)
函数,那么创建一个正则表达式来匹配字符串数组中的任何一个字符串呢?像这样的