编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下: Java中共有53个关键字(自行百度) 从键盘输入一段源码,统计这段源码中出现的关键字的数量 注释中出现的关键字不用统计 字符串中出现的关键字不用统计 统计出的关键字及数量按照关键字升序进行排序输出 未输入源码则认为输入非法 输入格式: 输入Java源码字符串,可以一行或多行,以exit行作为结束标志 输出格式: 当未输入源码时,程序输出Wrong Format 当没有统计数据时,输出为空 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
时间: 2024-02-27 20:51:37 浏览: 68
好的,这个问题我可以帮你解决。以下是Java程序的实现:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Map<String, Integer> map = new TreeMap<>();
String line;
StringBuilder sb = new StringBuilder();
boolean inString = false;
while (true) {
line = scanner.nextLine().trim();
if (line.equals("exit")) {
break;
}
sb.append(line).append("\n");
}
String srcCode = sb.toString();
String[] words = srcCode.split("\\W+"); // 以非单词字符为分隔符切分源码
for (String word : words) {
if (isKeyword(word) && !inString) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
String[] lines = srcCode.split("\\n"); // 判断是否在字符串中
for (String s : lines) {
if (s.contains("\"")) {
inString = !inString;
}
}
}
if (map.isEmpty()) {
System.out.println();
} else {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getValue() + "\t" + entry.getKey());
}
}
}
private static boolean isKeyword(String word) {
String[] keywords = {
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class",
"const", "continue", "default", "do", "double", "else", "enum", "extends", "final",
"finally", "float", "for", "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"
};
for (String keyword : keywords) {
if (keyword.equals(word)) {
return true;
}
}
return false;
}
}
```
程序的主要思路为:
1. 使用 `Scanner` 从控制台读入Java源码,直到输入 "exit" 为止,将源码保存在字符串 `srcCode` 中。
2. 将源码以非单词字符为分隔符切分,得到所有的单词。
3. 判断单词是否是Java关键字,如果是则统计出现次数。同时,还需要判断该单词是否在字符串中,如果在字符串中则不计入统计。
4. 使用 `TreeMap` 对所有的关键字进行升序排序,然后输出统计结果。
需要注意的点是,我们需要判断一个单词是否在字符串中,这里采用的方法是先将源码按行分割,然后查找每一行是否包含双引号,如果包含则表示当前位置在字符串中,需要将 `inString` 标记为 `true`。在遇到下一个双引号时,将 `inString` 标记为 `false`。这里需要注意的是,一个字符串可能跨越多行,因此我们需要在每行中都判断一次。
阅读全文