我正在尝试构建一个程序,它接收文件并输出文件中的字数。当所有的东西都在整段下面的时候,它就完美地工作了。然而,当有多个段落时,它没有考虑到新段落的第一个单词。例如,如果一个文件读到“我的名字是约翰”,程序将输出“4个单词”。但是,如果一个文件读到“我的名字是约翰”,每个单词都是一个新段落,程序就会输出"1字“。我知道这一定是关于我的if声明,但我认为在新的段落前面有空格,会考虑到新段落中的第一个单词。以下是我的代码:
import java.io.*;
public class HelloWorld
{
public static void main(String[]args)
{
try{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("health.txt");
// Use DataInputStream to read binary NOT text.
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
int word2 =0;
int word3 =0;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
;
int wordLength = strLine.length();
System.out.println(strLine);
for(int i = 0 ; i < wordLength -1 ; i++)
{
Character a = strLine.charAt(i);
Character b= strLine.charAt(i + 1);
**if(a == ' ' && b != '.' &&b != '?' && b != '!' && b != ' ' )**
{
word2++;
//doesnt take into account 1st character of new paragraph
}
}
word3 = word2 + 1;
}
System.out.println("There are " + word3 + " "
+ "words in your file.");
//Close the input stream
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
}我尝试过调整if语句的多个团队,但这似乎没有什么区别。有人知道我在哪里搞砸了吗?
我是一个非常新的用户,几天前我问了一个类似的问题,人们指责我对用户要求过高,所以希望这能稍微缩小我的问题范围。我真的很困惑,为什么它没有考虑到一个新段落的第一个词。如果你需要更多的信息,请告诉我。谢谢!!
发布于 2013-08-13 03:43:41
首先,你的计数逻辑是不正确的。考虑:
word3 = word2 + 1;想想这个能做什么。每次在循环过程中,当您读取一行时,基本上都会对该行中的单词进行计数,然后将总计数重置为word2 + 1。提示:如果要计算文件中的总数,则每次都要增加word3,而不是将其替换为当前行的字数。
其次,您的单词解析逻辑略为偏离。考虑一下空行的情况。您将不会在其中看到任何单词,但您将行中的单词计数视为word2 + 1,这意味着您将空行错误地计数为1字。提示:如果行中的第一个字符是字母,则行以一个单词开始。
您的方法是合理的,尽管您的实现略有缺陷。作为另一种选择,您可能希望在每一行上考虑String.split()。结果数组中的元素数是行上的单词数。
顺便说一句,如果为变量使用有意义的名称(例如totalWords而不是word3),则可以提高代码的可读性,并使调试变得更容易。
发布于 2013-08-13 03:57:38
如果你的段落不是用空格开头的,那么你的if条件将不包括第一个单词。“我的名字是约翰”,程序会输出"4字“,这是不正确的,因为你错过了第一个单词,但在后面加了一个。试试这个:
String strLine;
strLine = strLine.trime();//remove leading and trailing whitespace
String[] words = strLine.split(" ");
int numOfWords = words.length;发布于 2013-08-13 04:10:55
我个人更喜欢普通的扫描仪,基于标记的扫描这类东西。像这样的事怎么样:
int words = 0;
Scanner lineScan = new Scanner(new File("fileName.txt"));
while (lineScan.hasNext()) {
Scanner tokenScan = new Scanner(lineScan.Next());
while (tokenScan.hasNext()) {
tokenScan.Next();
words++;
}
}这将遍历文件中的每一行。对于文件中的每一行,它遍历每个令牌(在本例中为单词),并增加单词计数。
https://stackoverflow.com/questions/18200203
复制相似问题