java中数组与字符串的匹配

u4dcyp6a  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(595)

我正在使用bufferedreader读取一个文件,所以假设我

line = br.readLine();

我想检查这一行是否包含许多可能的字符串中的一个(在数组中)。我希望能够写一些东西,比如:

while (!line.matches(stringArray) { // not sure how to write this conditional
  do something here;
  br.readLine();
}

我对编程和java还比较陌生,我这样做对吗?

64jmpszr

64jmpszr1#

这取决于什么 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
}

您可能希望更有效地完成这项工作(比如不要用每行编译模式),但这是要使用的基本工具。

ux6nzvsh

ux6nzvsh2#

将所有值复制到 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;
}

当使用regexp或更复杂的方法进行匹配时,相应地调整检查。
[edit2]第三个选项是将数组中的元素串联在一个巨大的regexp中 | :

Pattern p = Pattern.compile("str1|str2|str3");

while (!p.matcher(line).find()) { // or matches for a whole-string match
    ...
}

如果数组中有许多元素,这可能会更便宜,因为regexp代码将优化匹配过程。

qnyhuwrf

qnyhuwrf3#

使用 String.matches(regex) 函数,那么创建一个正则表达式来匹配字符串数组中的任何一个字符串呢?像这样的

String regex = "*(";
for(int i; i < array.length-1; ++i)
  regex += array[i] + "|";
regex += array[array.length] + ")*";
while( line.matches(regex) )
{
  //. . . 
}

相关问题