当前位置: 首页 > 知识库问答 >
问题:

为什么这计算的字数不正确?

柳英豪
2023-03-14

公共静态无效字(字符串文本){int numWords=1;

    for (int charNum = 0; charNum < text.length(); charNum++) {
        char letter = text.charAt(charNum);
        
        if(charNum + 1 < text.length()) {
            char nextLetter = text.charAt(charNum + 1);
            if(letter == '.' || letter == ':' || letter == ';' || letter == '?' || letter == '!'|| letter == ' ' || letter == '\n' || letter == '\t') {
                if(nextLetter != '.' || nextLetter != ':' || nextLetter != ';' || nextLetter != '?' || nextLetter != '!'|| nextLetter != ' ' || nextLetter != '\n' || nextLetter != '\t')
                    numWords += 1;
            }   
        }
    }
    
    System.out.println("Number of words: " + numWords);
}

字符串“是this_one_long_word还是几个???你觉得怎么样??太多“应该打印10个字和”!这使用periods.as.word.delimiters,可能很棘手。“应该打印10个单词。

描述如下:一个单词是由一个或多个字符组成的序列,由空格或句子终止符(句号、冒号、分号、问号、感叹号)分隔,无论它是否为实际的英语单词。空白被定义为空格、制表符('\t')、新行字符('\n')和字符串本身的结尾。这再次给出了一些可能没有意义的结果。例如,文本“我不喜欢使用空格!”只有一个词:我永远不喜欢使用空格。

共有2个答案

薛涛
2023-03-14

您在最后一个if(最嵌套的一个)中有无效条件-您需要确保下一个字符(在代码中称为nextLetter)不是您检查的字符,但您使用或代替了和条件,因此它始终为真(因为字符不能同时是两个不同的字符)。

因此,您可以将此如果更改为:

if(nextLetter != '.' && nextLetter != ':' && nextLetter != ';' && nextLetter != '?' && nextLetter != '!'&& nextLetter != ' ' && nextLetter != '\n' && nextLetter != '\t')

它会正确地计算单词。请确保您也计算第一个单词,因为目前如果您将NumWords设置为零,它将为您的示例打印9而不是10-因为第一个单词不被计算在内。所以你也应该数数。

Btw.您的代码可以在几个方面得到显著简化,您也可以使用替代方法,如拆分函数(来自String)。

缪朝
2023-03-14

以下一行始终正确:

if(nextLetter != '.' || nextLetter != ':' || nextLetter != ';' || nextLetter != '?' || nextLetter != '!'|| nextLetter != ' ' || nextLetter != '\n' || nextLetter != '\t')

将其更改为:

if(nextLetter != '.' && nextLetter != ':' && nextLetter != ';' && nextLetter != '?' && nextLetter != '!'&& nextLetter != ' ' && nextLetter != '\n' && nextLetter != '\t')

开始计算int numwords=1 将为您提供不正确的计数。从0开始。

您的第二个输入从开始!向计数中添加一个单词。
您必须检查终止符后面的字符是否是字母,以避免这种行为:

 public static void words(String text) {
        int numWords = 0;
        final String wordTerminators = ".:;?! \n\t";
        for (int charNum = 0; charNum < text.length() - 1; charNum++) {
            char letter = text.charAt(charNum);
           
            char nextLetter = text.charAt(charNum + 1);
            if (wordTerminators.contains(letter + "")) {
                if (!wordTerminators.contains(nextLetter + "") && !(nextLetter+"").matches("[A-Za-z]"))
                    numWords += 1;
            }

        }
        System.out.println("Number of words: " + numWords);
    }

以下是我的解决方案的更清晰版本:

    public static void words(String text) {
        int numWords = 0;
        
        String[] splitted = text.split("[.:;?! \\n\\t]+");
        for (String word : splitted) {
            if (word.length() > 0)
                numWords++;
        }
        System.out.println("Number of words: " + numWords);
    }

两种方法的输出都是:

Number of words: 10
Number of words: 10

 类似资料:
  • 我正在尝试限制关键字输入。 每当用户输入一个关键字,它就会在该关键字后面加上'span',例如。 如下面的html代码。 我可以限制字,但计数不准确,但当它达到5,它停止输入。 如果我刷新页面,我可以再输入一个,然后再阻止我一次。 奇怪的是,如果我为使用id就不起作用了。我得利用课堂。 我试过把,但不起作用,我必须保留它的资本。 jQuery: HTML:

  • 我已经把一些代码放在一起,对人们的考试成绩进行排序,这样他们就可以看到他们的最高成绩是什么,以及他们什么时候达到的。我创建了以下代码,但它没有显示1、2、3等计数器,我缺少什么? 它打印以下内容,所有内容都显示1,而它应该是1、2、3等。

  • (英语不是我的第一语言,所以请原谅任何错误) 我使用SparkSQL从hive表中读取4.7TB的数据,并执行计数操作。做那件事大约需要1.6小时。而直接从HDFS txt文件读取和执行计数,只需要10分钟。这两个作业使用相同的资源和并行性。为什么RDD计数需要这么多时间? 配置单元表大约有30万列,序列化可能代价高昂。我检查了spark UI,每个任务读取大约240MB的数据,执行大约需要3.6

  • 问题内容: 下面是分别用和编码的简单过程(对于那些对此过程感到好奇的人,这是针对Euler项目5号问题的解决方案)。 我的问题是,下面的代码仅需9秒即可迭代,而代码完成则需要283秒(确切地说,在Python 3.4.3-64位上为283秒,在Python 2.7.9-32位上为329秒)。 到目前为止,我已经编码的两种类似的过程和与执行时间的差异,具有可比性。但是,这次,经过的时间之间存在极大的

  • 本文向大家介绍js为什么不能正确处理小数运算?,包括了js为什么不能正确处理小数运算?的使用技巧和注意事项,需要的朋友参考一下 上面的程序会输出1吗? 在 你有必要知道的 25 个 JavaScript 面试题 一文中,第 8 个题浅显的说了下 js 为什么不能正确处理小数运算的问题。今天重拾旧题,更深层次的剖析下这个问题。 但要先说明的是,不能正确处理小数的运算并不是 JavaScript 语言

  • 问题内容: 我有一个像这样的mysql表: 当访问者访问该网站时,它将其访问者ID和页面ID存储为一行。 我试图提取恰好X次访问该网站的访问者数量。(用于图表)。那么有多少人只访问一页,有多少人访问了2页… 到目前为止,我有: 但是我不知道该怎么做下一部分的计数。 可以作为MySQL查询吗? 问题答案: 我可以这样解决: 这一点很重要。