我需要获得wordcount,charcount和linecount:

时间:2014-11-12 14:49:07

标签: java

结果正确地给出了单词,但不是字符或行。如何让扫描仪返回到文件的开头?使用三个扫描仪不起作用。

public static void main (String[] args) throws FileNotFoundException
{   
    int iCharCount = 0;
    int iWordCount = 0;
    int iLineCount = 0;
    Scanner scConsole = new Scanner(System.in);
    System.out.println("Input File:");
    String sInputFile = scConsole.next();
    File inputFile = new File(sInputFile);
    Scanner in = new Scanner(inputFile);

    //gets the number of words  
    while(in.hasNext())
    {
        String sInput = in.next();
        iWordCount++;
    }
    System.out.println("Words: " + iWordCount);

    //gets the number of characters
    while(in.hasNext())
    {
        char ch = in.next().charAt(0);
        iCharCount++;
    }
    System.out.println("Characters: " + iCharCount);

    //gets the number of lines
    while(in.hasNextLine())
    {
        String sLine = in.nextLine();
        iLineCount++;
    }
    System.out.println("Lines: " + iLineCount);

    scConsole.close();
    in.close();
}

所以,当我输入一个包含句子的文本文件时:“猫在帽子里。” 结果是: 字数:6 人物:0 行:0

4 个答案:

答案 0 :(得分:1)

更好的方法是将整个文件读作String,然后你可以编写一个类:

public class WordCount {
    private static String SEPARATOR = System.getProperty("line.separator");
    private String text;

    public WordCount(final String text) {
        this.text = text;
    }

    public int chars() {
        return text.length();
    }

    public int words() {
        if (text.isEmpty()) {
           return 0;
        }
        return text.trim().split("\\s+").length;
    }

    public int lines() {
        if (text.isEmpty()) {
          return 0;
        }
        return text.trim().split(SEPARATOR).length;
    }

    public void setText(final String text) {
        this.text = text;
    }
}

你的主要可能是:

public class Main {
    public static void main(String[] args) {
        final String text = readTheWholeText(); // you have to implement this
        WordCount wc = new WordCount(text);
        final int chars = wc.chars();
        final int lines = wc.lines();
        final int words = wc.words();
        System.out.println("words = " + words + "  chars = " + chars + "  lines = " + lines);
    }
}

btw阅读整个文本文件:Reading from a text file and storing in a StringJava: How to read a text file

答案 1 :(得分:0)

这是因为Scanner维护用于逐行读取文件的光标。 因此,每次使用in.next时,光标都会重新定位以匹配新行。 因此,即使在您提供的示例中,in.next也会读取第一行。当再次使用in.next时,它会将光标移动到下一行。但这里只有一条线。 那就是你得到的行数和字数为0。

更好的方法是将in.next存储在String变量中,然后使用它来查找字符数。

并相应地更改行号

答案 2 :(得分:0)

我认为这是作业。我不认为Scanner是最好的选择,可能BufferedReader会更好,但Scanner会工作。您无需备份,您可以通过该文件轻松完成此操作。

你正在向后做,不先计算单词,抓住每一行(并保持计数),然后在空格上划分行以获得单词计数,然后计算每个单词中的字符。

类似的东西(这是未经测试的,只是让你走上正轨):

 //gets the number of lines
int iLineCount = 0;
    int wordCount = 0;
    int characterCount = 0;
    while (in.hasNextLine()) {
        String sLine = in.nextLine();
        iLineCount++;
        String[] words = sLine.split(" ");
        wordCount =+ words.length;
        for (String word : words) {
            characterCount =+ word.length();
        }
    }

答案 3 :(得分:0)

假设这是一个家庭作业,最好自己尝试,但你可以针对每个案例尝试以下方法(如果允许使用它们):

1)对于行数:按行分隔符分割文本,然后获取数组大小。

2)对于字数:按空格分隔符和行分隔符分割文本,然后获取数组大小。

3)对于字符计数:使用String length()方法。

搜索字符串split(...)length()方法。