Java中的字数统计错误输出

时间:2014-07-02 07:12:58

标签: java

我是Java新手。 我编写了一个代码来计算文件中特定单词的出现次数。要向用户询问要计算的单词。我写了两个代码。第一个代码运行正常,计数正确。而在第二个代码中,计数较少。我无法弄清楚原因。有人可以帮我找到第二个代码中的缺陷吗?

从文件中读取的段落和两个代码如下所示。

段落:

在文字处理和桌面发布中,硬回车或分段符表示新段落,以区别于段落内部行末尾的软回车。这种区别允许自动换行在编辑时自动重新流动文本,而不会丢失分段符。软件可以在段落中应用垂直空格或缩进,具体取决于所选的样式。

实际存储此类文档的方式取决于文件格式。例如,HTML使用

标记作为段落容器。在纯文本文件中,有两种常见格式。预格式化文本将在每个物理行的末尾添加换行符,并在段落末尾添加两个换行符,从而创建一个空行。另一种方法是只在每个段落的末尾添加换行符,并将自动换行显示在显示或处理文本的应用程序中(如果有必要的话)。

代码1:提供正确的输出

package prac3;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class FromFile {

    private String word;

    FromFile() {
    }

    int Count(String word1) throws IOException {
        this.word = word1;
        String abc;
        int count = 0, total = 0;
        try {
            BufferedReader in = new BufferedReader(
                    new FileReader(
                            "C:\\Documents and Settings\\Administrator.EGOVPC79\\Desktop\\file.txt"));

            while ((abc = in.readLine()) != null) {
                String abc1 = abc;
                Scanner s = new Scanner(abc1);
                while (s.hasNext()) {
                    total++;
                    if (s.next().equals(word)) {
                        count++;
                    }
                }
            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("total" + total);
        return count;
    }

    public static void main(String[] args) throws IOException {
        FromFile obj = new FromFile();
        String word;
        Scanner abc = new Scanner(System.in);
        System.out.println("Enter the word you want to count");
        word = abc.nextLine();
        int count = obj.Count(word);
        System.out.println("The occurence is :" + count);

    }
}

代码2:这会产生错误的输出。

package prac3_2;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class File {

    private String word;
    private String abc1;

    File() throws IOException {
        String abc;
        BufferedReader in = new BufferedReader(
                new FileReader(
                        "C:\\Documents and Settings\\Administrator.EGOVPC79\\Desktop\\file.txt"));
        while ((abc = in.readLine()) != null) {
            abc1 = abc;
            System.out.println(abc1);
        }
        in.close();
    }

    int Count(String word1) {
        this.word = word1;
        int count = 0, total = 0;
        Scanner s = new Scanner(abc1);
        while (s.hasNext()) {
            total++;
            if (s.next().equals(word)) {
                count++;
            }
        }
        System.out.println("total" + total);
        return count;
    }

    public static void main(String[] args) throws IOException {
        File obj = new File();
        String word;
        Scanner abc = new Scanner(System.in);
        System.out.println("Enter the word you want to count");
        word = abc.nextLine();
        int count = obj.Count(word);
        System.out.println("The occurence is :" + count);
    }
}

2 个答案:

答案 0 :(得分:1)

问题是abc1没有所有文本,并且在计数时,它仅在它读取的最后一行中计算所提供的单词(存储在abc1中)

在读取文件时使用StringBuilder,追加读取文件的每一行将使计数逻辑工作。

private StringBuilder abc1 = new StringBuilder();
....
....
 abc1.append(abc);
...
...
Scanner s = new Scanner(abc1.toString()); 

这将读取整个文本并扫描单词

答案 1 :(得分:0)

我是File

的构造函数
String abc;
while((abc = in.readLine()) != null)
        {
        abc1=abc;
        System.out.println(abc1);
        }       
    in.close();

您在aloop中读取了孔文件,但只保存了成员变量abc1中的最后一行

以后的计数仅在最后一行进行。

您可能希望将membervariable更改为List<String>,您可以在其中添加在构造函数中读取的行。在计数中,您可以迭代该列表并计算每个列表元素中的单词。