【问题标题】:Count number of times string appears in a file计算字符串在文件中出现的次数
【发布时间】:2016-04-28 11:05:32
【问题描述】:

我正在尝试计算某个字符串在文本文件 (.txt) 中出现的次数,到目前为止,我让 FileReader 工作(它读取文件,我可以输出文件中的文本到控制台)。我想要知道的是检查文本文件中是否存在字符串(由用户输入)。我到目前为止是这样的:

import java.io.*;
import java.util.Scanner;

public class Assignment2 {

    String fileName = "test.txt";
    String line = null;
    int counter = 0;

    public String getUserInput() {
        String userInput;
        Scanner userInputScanner = new Scanner(System.in);
        userInput = userInputScanner.nextLine();
        return userInput;
    }

    public String returnUserInput() {
        String userInput = getUserInput();
        return userInput;
    }


    public void readFile() {        
        try {

            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            while((line = bufferedReader.readLine()) != null) {
                while (line.indexOf(word, indexOfWord) != -1) {
                    indexOfWord += word.length();
                    counter += 1;
                }
            }
            bufferedReader.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Assignment2 test = new Assignment2();
        test.readFile();
    }

}

发生的事情是我无法遍历文件,当我使用 for 循环运行程序时,它卡住了(?),它只是继续运行而没有错误,但它什么也没做。

我知道我的问题在于 for 循环(line.length() 不起作用,因为缓冲的阅读器一次读取一行......我真正想要的是获取文件)。我也无法检查用户输入(我想忽略字母的大小写,但我不能用 .contains() 做到这一点,而且我想不出另一种方法来检查该行是否包含用户输入) .

另外,我的过程是否正确,或者我这样做的方式效率不高?我必须检查一个 3000 字的文档。

【问题讨论】:

  • 您的问题是什么?问题是什么?请编辑您的问题以包含确切的错误和确切的预期行为。
  • 对我来说听起来像是一个家庭作业问题。你不应该在这里直接问这样的问题。如果只有 3000 字,您可以简单地将整个文件读入内存并连接行(StringBuilder),然后用 for 循环计算出现次数。
  • 如果您正在寻找其他方法,您可以搜索 SO 以了解有关 counting the occurence of a particular String in a file 的其他问题。

标签: java search filereader java-io


【解决方案1】:

您的程序没有“卡住”,它正在等待您输入“用户输入”(再次)。

你在循环中不断调用returnUserInput(),它会调用getUserInput(),它会等待你输入(另一个)字符串并按Enter。


至于您的代码,不要将line 声明为字段。它应该是一个局部变量。

对于重复搜索一行中的文本,不要使用contains() 或该行的每个字符的循环。使用indexOf(String str, int fromIndex)

更新

代码应该是这样的:

String word = returnUserInput();
this.counter = 0;
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
    for (String line; (line = reader.readLine()) != null; ) {
        for (int i = 0; (i = line.indexOf(word, i)) != -1; i += word.length()) {
            this.counter++;
        }
    }
}

【讨论】:

  • 那么行应该在readFile函数中声明吗?对于使用 indexOf,它只返回第一次找到字符串的时间。有没有办法重复它,每次返回一个索引,我可以增加一个计数器?
  • @MahmudAssamaray 是的,内部方法。 --- 你继续调用indexOf()fromIndex 等于先前调用的返回值加上搜索字符串的长度。第一次通话时,fromIndex 应该是 0
  • 我几乎让它工作了......但由于某种原因,当我输入文件中存在的单词时,它返回的数字大于出现次数。这是我添加的代码 while (line.indexOf(word, indexOfWord) != -1) { indexOfWord += word.length(); counter += 1; } 我还将更新我的问题以显示新代码,以提高可读性
  • 如果字符串存在,则始终返回 1,例如,当我执行 system.out.println(counter); 时。它输出 1。我以另一种方式进行,循环并截断文本文件,它以这种方式工作。
【解决方案2】:

如果要忽略大小写,请使用以下方法:

line.toLowerCase().contains(text.toLowerCase())

line 是您从文件中读取的行。
text 是用户输入的字符串,这就是您要查找的内容。
定义一个计数器变量来跟踪数字。

然后检查是否找到匹配项,如果找到,则增加计数器。 我可以给你确切的代码,但那样你就学不会了。如果您遇到困难并且这不起作用,我可以进一步帮助您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2011-10-08
    • 1970-01-01
    • 2014-04-24
    • 2013-12-23
    相关资源
    最近更新 更多