计算文件中的字符,单词和行

这应该计算文件中的行数,单词和字符数。

但它不起作用。 从输出它只显示0

码:

 public static void main(String[] args) throws IOException { int ch; boolean prev = true; //counters int charsCount = 0; int wordsCount = 0; int linesCount = 0; Scanner in = null; File selectedFile = null; JFileChooser chooser = new JFileChooser(); // choose file if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { selectedFile = chooser.getSelectedFile(); in = new Scanner(selectedFile); } // count the characters of the file till the end while(in.hasNext()) { ch = in.next().charAt(0); if (ch != ' ') ++charsCount; if (!prev && ch == ' ') ++wordsCount; // don't count if previous char is space if (ch == ' ') prev = true; else prev = false; if (ch == '\n') ++linesCount; } //display the count of characters, words, and lines charsCount -= linesCount * 2; wordsCount += linesCount; System.out.println("# of chars: " + charsCount); System.out.println("# of words: " + wordsCount); System.out.println("# of lines: " + linesCount); in.close(); } 

我无法理解发生了什么。 有什么建议么?

不同的方法。 使用字符串查找行,单词和字符计数:

 public static void main(String[] args) throws IOException { //counters int charsCount = 0; int wordsCount = 0; int linesCount = 0; Scanner in = null; File selectedFile = null; JFileChooser chooser = new JFileChooser(); // choose file if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { selectedFile = chooser.getSelectedFile(); in = new Scanner(selectedFile); } while (in.hasNext()) { String tmpStr = in.nextLine(); if (!tmpStr.equalsIgnoreCase("")) { String replaceAll = tmpStr.replaceAll("\\s+", ""); charsCount += replaceAll.length(); wordsCount += tmpStr.split(" ").length; } ++linesCount; } //display the count of characters, words, and lines System.out.println("# of chars: " + charsCount); System.out.println("# of words: " + wordsCount); System.out.println("# of lines: " + linesCount); in.close(); } 

注意:
对于其他编码样式,请使用new Scanner(new File(selectedFile), "###"); 代替new Scanner(selectedFile);

###是需要的字符集。 请参阅此和维基

您的代码仅查看文件中默认标记(单词)的第一个字符。

当你执行ch = in.next().charAt(0) ,它会获得一个标记(单词)的第一个字符,然后扫描程序向前移动到下一个标记(跳过该标记的其余部分)。

你在这里有几个问题。

首先是对行结束的测试会引起问题,因为它通常不是表示行尾的单个字符。 有关此问题的更多详细信息,请阅读http://en.wikipedia.org/wiki/End-of-line 。

单词之间的空白字符可以不仅仅是ASCII 32(空格)值。 将制表符视为一种情况。 您想要检查Character.isWhitespace()的可能性。

您还可以使用如何使用扫描仪检查行尾找到两个扫描程序来解决行结束问题?

以下是您提供的代码以及输入和输出的快速入侵。

 import java.io.*; import java.util.Scanner; import javax.swing.JFileChooser; public final class TextApp { public static void main(String[] args) throws IOException { //counters int charsCount = 0; int wordsCount = 0; int linesCount = 0; Scanner fileScanner = null; File selectedFile = null; JFileChooser chooser = new JFileChooser(); // choose file if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { selectedFile = chooser.getSelectedFile(); fileScanner = new Scanner(selectedFile); } while (fileScanner.hasNextLine()) { linesCount++; String line = fileScanner.nextLine(); Scanner lineScanner = new Scanner(line); // count the characters of the file till the end while(lineScanner.hasNext()) { wordsCount++; String word = lineScanner.next(); charsCount += word.length(); } lineScanner.close(); } //display the count of characters, words, and lines System.out.println("# of chars: " + charsCount); System.out.println("# of words: " + wordsCount); System.out.println("# of lines: " + linesCount); fileScanner.close(); } } 

这是测试文件输入:

 $ cat ../test.txt test text goes here and here 

这是输出:

 $ javac TextApp.java $ java TextApp # of chars: 23 # of words: 6 # of lines: 2 $ wc test.txt 2 6 29 test.txt 

字符数之间的差异是由于不计算空白字符,这些字符似乎是您在原始代码中尝试执行的操作。

我希望有所帮助。

您可以将每行存储在List ,然后linesCount = list.size()

计算charsCount

 for(final String line : lines) charsCount += line.length(); 

计算wordsCount

 for(final String line : lines) wordsCount += line.split(" +").length; 

将这些计算结合在一起而不是单独进行这些计算可能是一个明智的想法。

使用Scanner方法:

 int lines = 0; int words = 0; int chars = 0; while(in.hasNextLine()) { lines++; Scanner lineScanner = new Scanner(in.nextLine()); lineScanner.useDelimiter(" "); while(lineScanner.hasNext()) { words++; chars += lineScanner.next().length(); } } 

看起来每个人都在建议你一个替代品,

你的逻辑存在的缺陷是,你没有遍历整行的所有字符。 你只是循环遍历每一行的第一个字符。

  ch = in.next().charAt(0); 

另外, charsCount -= linesCount * 2;中的2是charsCount -= linesCount * 2; 代表?

您可能还希望在访问文件时包含try-catch块。

  try { in = new Scanner(selectedFile); } catch (FileNotFoundException e) {} 

也许我的代码会帮助你…一切正常

 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; import java.util.StringTokenizer; public class LineWordChar { public static void main(String[] args) throws IOException { // Convert our text file to string String text = new Scanner( new File("way to your file"), "UTF-8" ).useDelimiter("\\A").next(); BufferedReader bf=new BufferedReader(new FileReader("way to your file")); String lines=""; int linesi=0; int words=0; int chars=0; String s=""; // while next lines are present in file int linesi will add 1 while ((lines=bf.readLine())!=null){ linesi++;} // Tokenizer separate our big string "Text" to little string and count them StringTokenizer st=new StringTokenizer(text); while (st.hasMoreTokens()){ `enter code here` s = st.nextToken(); words++; // We take every word during separation and count number of char in this words for (int i = 0; i < s.length(); i++) { chars++;} } System.out.println("Number of lines: "+linesi); System.out.println("Number of words: "+words); System.out.print("Number of chars: "+chars); } } 
 public class WordCount { /** * @return HashMap a map containing the Character count, Word count and * Sentence count * @throws FileNotFoundException * */ public static void main() throws FileNotFoundException { lineNumber=2; // as u want File f = null; ArrayList list=new ArrayList(); f = new File("file.txt"); Scanner sc = new Scanner(f); int totalLines=0; int totalWords=0; int totalChars=0; int totalSentences=0; while(sc.hasNextLine()) { totalLines++; if(totalLines==lineNumber){ String line = sc.nextLine(); totalChars += line.length(); totalWords += new StringTokenizer(line, " ,").countTokens(); //line.split("\\s").length; totalSentences += line.split("\\.").length; break; } sc.nextLine(); } list.add(totalChars); list.add(totalWords); list.add(totalSentences); System.out.println(lineNumber+";"+totalWords+";"+totalChars+";"+totalSentences); } }