在文本文件中搜索字符串

时间:2015-10-04 23:04:21

标签: java

我正在尝试在文本文件中搜索一组关键字。

我把它们作为一个字符串,我遇到了if语句的问题。

在这一行:

if(s.contains (keywords)) {

我之前没有。它说要做以下事情:

  

方法包含(CharSequence)类型String不适用于参数(String []))

但是这只会将字符串更改为CharSequence,仍然会导致错误!

以下是代码:

import java.io.*;

public class SearchTextFile {

    public static void main(String args[]) throws Exception {
        int tokencount;
        FileReader fr = new FileReader("c:\\searchtxt.txt");
        BufferedReader br = new BufferedReader(fr);
        String s;
        int linecount = 0;

        String[] keywords = {
            "AB", "BC", "D1", "B11", "BL:", "B/1:", "B1L:", "B11:"
        };
        String line;

        while ((s = br.readLine()) != null) {
            if (s.contains(keywords)) {
                System.out.println(s);
                String nextLine = br.readLine();
                System.out.println(nextLine);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:3)

由于String没有方法String.contains(String),您可以按如下方式实现:

将您的关键字数组更改为ArrayList<String>。 然后,当您读取一行时,使用String.split()方法获取数组中的所有单词。现在,您可以遍历单词数组(通过从文件中读取行创建)并检查keywordList是否包含单词。 注意:KeywordList.contains(s)如果true与关键字完全相同,则为s。如果false是包含其他单词的字符串,但它包含s数组中的一个或多个元素,则会生成keywords。因此,此测试不会产生有效的搜索结果。搜索的目的是检查任何输入行s,如果它至少有keywords数组中的一个关键字。所以一个这样的解决方案可以如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

public class SearchTextFile
{
    public static void main(String args[]) throws Exception
    {
        int tokencount;
        FileReader fr = new FileReader("c:\\searchtxt.txt");
        BufferedReader br = new BufferedReader(fr);

        String s = "";
        int linecount = 0;
        ArrayList<String> keywordList = new ArrayList<String>(Arrays.asList("AB", "BC", "D1", "B11", "BL:", "B/1:", "B1L:", "B11:"));

        String line;
        while ((s = br.readLine()) != null)
        {
            String[] lineWordList = s.split(" ");
            for (String word : lineWordList)
            {
                if (keywordList.contains(word))
                {
                    System.out.println(s);
                    String nextLine = br.readLine();
                    System.out.println(nextLine);
                    break;
                }
            }
        }
    }
}

答案 1 :(得分:1)

更有效的方法是将关键字列表存储在Set中,并在一组中的每一行上存储令牌列表。这可以防止迭代列表中所有元素所涉及的低效率。考虑到这一点,我稍微修改了您的代码:

public static void main(String args[]) throws Exception
{
    int tokencount;
    FileReader fr=new FileReader("c:\\searchtxt.txt");
    BufferedReader br=new BufferedReader(fr);
    String s;
    int linecount=0;

    //String[]  keywords = { "AB", "BC","D1", "B11", "BL:", "B/1:","B1L:", "B11:"};
    Set<String> keywords = new HashSet<>(Arrays.asList("AB", "BC", "D1", "B11", "BL:", "B/1:", "B1L:", "B11:"));
    String line;
    Set<String> lineSet;

    while ((s=br.readLine())!=null) {
        lineSet = new HashSet(Arrays.asList(s.split(" ")));
        if(!Collections.disjoint(lineSet, keywords)) { //returns true if both sets have no elements in common;
            System.out.println(s);
            String nextLine = br.readLine();
            System.out.println(nextLine);
        }
    }
}

答案 2 :(得分:0)

你不能对enqueue使用字符串数组(String[]),而是使用正则表达式,即:

contains

答案 3 :(得分:0)

没有包含(String [])的方法。正确的是包含(String)

像@Pedro Lobito所说,你可以使用正则表达式。你也可以循环遍历你的字符串数组,

while ((s=br.readLine())!=null) {
    for (String str: keywords) {           
        if(s.contains (str)) {
            System.out.println(s);
            String nextLine = br.readLine();
            System.out.println(nextLine);
        }
    }
}