字符计数在Java中不累加

时间:2019-03-16 12:28:25

标签: java

我正在编写一个遍历文件并提供字符计数的Java程序。我遇到的问题是我的人数没有增加。当我添加isAlphabetic(char c)isDigit(char c)时,它们不等于isLetterOrDigit(char c)方法(如果我使用的术语错误,请原谅我)。

我想念什么?到目前为止,这是我的代码的副本。

for (String word : words) {
                char[] ch = word.toCharArray();
                for (int i = 0; i < word.length(); i++) {
                    if (Character.isBmpCodePoint(ch[i])) {
                        charCount++;
                        if (Character.isLetterOrDigit(ch[i])) {
                            alphnumCount++;
                        }
                        if (Character.isAlphabetic(ch[i])) {
                            alphabetCount++;
                        }
                        if (Character.isDigit(ch[i])) {
                            numericCount++;
                        }
                    }
                }
            }
            // Reading next line into currentLine
            currentLine = reader.readLine();
        }
        // Printing charCount, wordCount and lineCount
        System.out.println("Number Of Chars In..Lab.docx File : " + charCount);
        System.out.println("Number Of Alph+Numeric Chars In..Lab.docx File : " + alphnumCount);
        System.out.println("Number Of Alphabet Chars In..Lab.docx File : " + alphabetCount);
        System.out.println("Number Of Numeric Chars In..Lab.docx File : " + numericCount);
        System.out.println("Number Of Words In..Lab.docx File : " + wordCount);
        System.out.println("Number Of Lines In..Lab.docx File : " + lineCount);
        System.out.println(alphabetCount + numericCount - alphnumCount);

        reader.close(); // Closing the reader
    }
}

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是您正在读取*.docx文件。

如果我使用具有以下内容的简单文本文件,则您的脚本有效。

Test123
7asdf

输出为:

Number Of Chars In..CSCI_1136_Lab6.docx File : 12
Number Of Alph+Numeric Chars In..CSCI_1136_Lab6.docx File : 12
Number Of Alphabet Chars In..CSCI_1136_Lab6.docx File : 8
Number Of Numeric Chars In..CSCI_1136_Lab6.docx File : 4
Number Of Words In..CSCI_1136_Lab6.docx File : 2
Number Of Lines In..CSCI_1136_Lab6.docx File : 2
0

如果您想用这种方法无法计算*.docx文件中的字符,因为您正在将该文件的字节解释为String,而它们不是。

  

DOCX以XML格式编写,它由包含XML和二进制文件的ZIP存档文件组成。

来自forensicswiki

因此,*.docx文件不是以纯文本存储的,这是您期望在代码中得到的。

另一点是您使用的是Character.isAlphabetic()而不是Character.isLetter()

Character.isAlphabetic()形成docs

  

确定指定的字符(Unicode代码点)是否为字母。

     

如果字符的通用类别类型(由getType(codePoint)提供)为以下任意一种,则认为该字符为字母:

     
      
  • UPPERCASE_LETTER
  •   
  • LOWERCASE_LETTER
  •   
  • TITLECASE_LETTER
  •   
  • MODIFIER_LETTER
  •   
  • OTHER_LETTER
  •   
  • LETTER_NUMBER
  •   
     

或它具有Unicode标准定义的其他属性Other_Alphabetic。

Character.isLetter()形成docs

  

确定指定的字符(Unicode代码点)是否为字母。

     

如果Character.getType(ch)提供的常规类别类型为以下任意一种,则认为该字符为字母:

     
      
  • UPPERCASE_LETTER
  •   
  • LOWERCASE_LETTER
  •   
  • TITLECASE_LETTER
  •   
  • MODIFIER_LETTER
  •   
  • OTHER_LETTER
  •   
     

并非所有字母都有大小写。许多字符是字母,但既不是大写字母也不是小写字母也不是标题字母。

因此,这两种方法之间存在差异。方法Character.isLetterOrDigit()使用isLetter()isDigit();

  

确定指定的字符(Unicode代码点)是字母还是数字。

     

如果isLetter(codePoint)或isDigit(codePoint)对该字符返回true,则该字符被视为字母或数字。

docsCharacter.isLetterOrDigit()

因此,如果您使用Character.isLetter()而不是Character.isAlphabetic(),则结果应该正确。

这是我使用*.docx的{​​{1}}文件的结果:

Character.isLetter()