【问题标题】:How to take first word of new paragraph into consideration?如何考虑新段落的第一个单词?
【发布时间】:2013-08-14 13:04:03
【问题描述】:

我正在尝试构建一个程序来接收文件并输出文件中的字数。当一切都在一个完整的段落下时,它可以完美地工作。但是,当有多个段落时,它不会考虑新段落的第一个单词。例如,如果一个文件读取“我的名字是约翰”,程序将输出“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 语句,但似乎没有什么不同。有谁知道我在哪里搞砸了?

我是一个相当新的用户,几天前我问了一个类似的问题,有人指责我对用户要求太多,所以希望这能缩小我的问题范围。我真的很困惑为什么它不考虑新段落的第一个单词。如果您需要更多信息,请告诉我。谢谢!!

【问题讨论】:

    标签: java string character


    【解决方案1】:

    我不确定您所说的“段落”是什么意思,但是我尝试按照您的建议使用大写字母,并且效果很好。我使用了 Appache Commons IO 库

     package Project1;
    
    import java.io.*;
    import org.apache.commons.io.*;
    public class HelloWorld
    {
        private static String fileStr = "";
        private static String[] tokens;
        public static void main(String[]args)
        {
    
    
        try{
            // Open the file that is the first
            // command line parameter
            try {
                 File f = new File("c:\\TestFile\\test.txt");
                 fileStr = FileUtils.readFileToString(f);
                 tokens = fileStr.split(" ");
                 System.out.println("Words in file : " + tokens.length);
            }
        catch(Exception ex){
            System.out.println(ex);
        }           
    
        }catch (Exception e){//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    
    
    }
    

    }

    【讨论】:

      【解决方案2】:

      我个人更喜欢使用基于令牌扫描的常规扫描程序来处理这类事情。像这样的东西怎么样:

      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++;
          }
      }
      

      这会遍历文件中的每一行。对于文件中的每一行,它会遍历每个标记(在本例中为单词)并增加字数。

      【讨论】:

        【解决方案3】:

        首先,您的计数逻辑不正确。考虑:

        word3 = word2 + 1;
        

        想想这是做什么的。每次通过你的循环,当你阅读一行时,你基本上计算了该行中的单词,然后将总计数重置为word2 + 1。提示:如果你想统计文件中的总字数,你应该每次递增word3,而不是用当前行的字数替换它。

        其次,您的单词解析逻辑略有偏差。考虑空行的情况。您将在其中看不到任何单词,但您将行中的字数视为word2 + 1,这意味着您错误地将空白行计为 1 个单词。提示:如果该行的第一个字符是字母,则该行以单词开头。

        您的方法是合理的,尽管您的实施存在轻微缺陷。作为替代选项,您可能需要在每一行上考虑String.split()。结果数组中的元素数是该行的单词数。

        顺便说一句,如果您为变量使用有意义的名称(例如,totalWords 而不是 word3),您可以提高代码的可读性,并使调试更容易。

        【讨论】:

        • 哦,好吧 word3 = word2 + 1 背后的逻辑是,如果有人输入“我的名字是约翰”,则有 3 个空格,而四个单词。但随之而来的一点是,检查空格可能不是理想的计划,所以感谢您的提示。
        • 咳咳 word3 += word2 + 1。我试图在不泄露的情况下给你一个提示,但+= 会为每一行增加word3 的值,而= 会有效地丢弃所有先前行的计数。 ;)
        • 哦,递增 word3 抱歉,由于某种原因没有阅读该内容。生病尝试添加,而不是
        【解决方案4】:

        如果您的段落不是以空格开头,那么您的 if 条件不会计算第一个单词。 “My name is John”,程序会输出“4 words”,这是不正确的,因为你漏掉了第一个单词,后面又加了一个。 试试这个:

        String strLine;
        strLine = strLine.trime();//remove leading and trailing whitespace
        String[] words = strLine.split(" ");
        int numOfWords = words.length;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-27
          • 2018-03-24
          • 2019-06-01
          • 2022-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多