我正在编写一个遍历文件并提供字符计数的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
}
}
答案 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存档文件组成。
因此,*.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,则该字符被视为字母或数字。
从docs到Character.isLetterOrDigit()
。
因此,如果您使用Character.isLetter()
而不是Character.isAlphabetic()
,则结果应该正确。
这是我使用*.docx
的{{1}}文件的结果:
Character.isLetter()