我正在使用bufferedreader读取文件,所以我要说
line = br.readLine();
我想检查这一行是否包含许多可能的字符串之一(我在一个数组中)。我希望能够写出类似的内容:
while (!line.matches(stringArray) { // not sure how to write this conditional
do something here;
br.readLine();
}
我是编程和Java的新手,我是否正确地采用了这种方式?
答案 0 :(得分:3)
将所有值复制到Set<String>
,然后使用contains()
:
Set<String> set = new HashSet<String> (Arrays.asList (stringArray));
while (!set.contains(line)) { ... }
[编辑]如果你想知道行的一部分是否包含该集合中的字符串,你必须遍历该集合。将set.contains(line)
替换为:
public boolean matches(Set<String> set, String line) {
for (String check: set) {
if (line.contains(check)) return true;
}
return false;
}
使用正则表达式或更复杂的匹配方法时,相应地调整检查。
[EDIT2]第三个选项是在一个巨大的正则表达式中使用|
连接数组中的元素:
Pattern p = Pattern.compile("str1|str2|str3");
while (!p.matcher(line).find()) { // or matches for a whole-string match
...
}
如果数组中有许多元素,这可能会更便宜,因为正则表达式代码将优化匹配过程。
答案 1 :(得分:2)
这取决于stringArray
是什么。如果它是Collection
那么很好。如果它是一个真正的数组,你应该使它成为Collection
。 Collection
界面有一个名为contains()
的方法,用于确定给定的Object
是否在Collection
中。
将数组转换为Collection
的简单方法:
String tokens[] = { ... }
List<String> list = Arrays.asList(tokens);
List
的问题是查找费用昂贵(技术上线性或O(n)
)。更好的选择是使用Set
,它是无序的,但具有接近常量(O(1)
)的查找。你可以构建一个这样的:
来自Collection
:
Set<String> set = new HashSet<String>(stringList);
从数组:
Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
然后set.contains(line)
将是一项廉价的操作。
编辑:好的,我认为你的问题不明确。您想查看该行是否包含数组中的任何单词。你想要的是这样的:
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) { } }
}
这是一个非常粗略的检查,使用令人惊讶的开放,往往会给像“废料”这样的词语带来恼人的误报。对于更复杂的解决方案,您可能必须使用正则表达式并查找单词边界:
Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)");
Matcher m = p.matcher(line);
if (m.find() {
// word found
}
您可能希望更有效地执行此操作(例如不使用每行编译模式),但这是使用的基本工具。
答案 2 :(得分:0)
使用String.matches(regex)
函数,创建一个匹配字符串数组中任何一个字符串的正则表达式怎么样?像
String regex = "*(";
for(int i; i < array.length-1; ++i)
regex += array[i] + "|";
regex += array[array.length] + ")*";
while( line.matches(regex) )
{
//. . .
}