编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下: 代码小于60行。Java中共有53个关键字(自行百度) 从键盘输入一段源码,统计这段源码中出现的关键字的数量 注释中出现的关键字不用统计 字符串中出现的关键字不用统计 统计出的关键字及数量按照关键字升序进行排序输出 未输入源码则认为输入非法 输入格式: 输入Java源码字符串,可以一行或多行,以exit行作为结束标志 输出格式: 当未输入源码时,程序输出Wrong Format 当没有统计数据时,输出为空 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
时间: 2024-03-03 19:46:52 浏览: 106
代码行统计(可以对C\C++、Java的源代码进行统计,统计结果包括:总行数、空行数、注释行数和代码行数,统计结果可以以表格的形式显示给用户或另存为文件)
5星 · 资源好评率100%
好的,我会为您解答这个问题。
以下是 Java 代码实现,您可以在本地 IDE 运行它:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringBuilder sourceCodeBuilder = new StringBuilder();
String line;
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.equals("exit")) {
break;
}
sourceCodeBuilder.append(line).append("\n");
}
String sourceCode = sourceCodeBuilder.toString();
if (sourceCode.isEmpty()) {
System.out.println("Wrong Format");
return;
}
Set<String> keywordSet = new HashSet<>(Arrays.asList(
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue",
"default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto",
"if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package",
"private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch",
"synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"
));
Map<String, Integer> keywordCountMap = new TreeMap<>();
StringBuilder wordBuilder = new StringBuilder();
boolean isInString = false;
boolean isInComment = false;
for (int i = 0; i < sourceCode.length(); i++) {
char ch = sourceCode.charAt(i);
if (isInString) {
if (ch == '"') {
isInString = false;
}
} else if (isInComment) {
if (ch == '*' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '/') {
isInComment = false;
i++;
}
} else {
if (ch == '"') {
isInString = true;
} else if (ch == '/' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '/') {
break; // 单行注释,后面的内容不需要处理
} else if (ch == '/' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '*') {
isInComment = true;
i++;
} else if (Character.isLetterOrDigit(ch) || ch == '_') {
wordBuilder.append(ch);
} else {
if (wordBuilder.length() > 0) {
String word = wordBuilder.toString();
if (keywordSet.contains(word)) {
keywordCountMap.put(word, keywordCountMap.getOrDefault(word, 0) + 1);
}
wordBuilder.setLength(0);
}
}
}
}
if (keywordCountMap.isEmpty()) {
System.out.println();
} else {
for (Map.Entry<String, Integer> entry : keywordCountMap.entrySet()) {
System.out.printf("%d\t%s\n", entry.getValue(), entry.getKey());
}
}
}
}
```
代码逻辑如下:
1. 首先读入源码,把每一行的内容拼接在一起,直到输入 `exit` 为止;
2. 如果输入的源码为空,则输出 `Wrong Format`;
3. 定义一个 `Set` 存储 Java 关键字;
4. 定义一个 `Map` 存储每个关键字出现的次数;
5. 遍历源码字符串中的每一个字符,判断是否处于字符串或注释中,以及当前字符是否为关键字的一部分;
6. 如果当前字符不是关键字的一部分,则把之前的字符拼接起来作为一个单词,判断该单词是否为关键字,如果是,则把该关键字的计数加 1;
7. 遍历完整个源码后,如果没有统计到任何关键字,则输出空行;
8. 否则,按照关键字升序输出每个关键字及其出现次数。
希望我的解答能够帮助到您!
阅读全文