编写一段java代码并使用treeMap使其能够计算输入的一段规范的源码所含有的关键词及数量,注释中的关键词不算,字符串中的关键词不算
时间: 2024-03-14 15:43:44 浏览: 66
好的,以下是修改后的Java代码,它可以计算输入的一段规范的源码中所含有的关键词及数量,注释中的关键词和字符串中的关键词不会被计算:
```java
import java.util.Scanner;
import java.util.TreeMap;
public class KeywordCounter {
public static void main(String[] args) {
// 定义TreeMap存储关键词及其数量
TreeMap<String, Integer> keywords = new TreeMap<>();
// 获取用户输入的源码
Scanner scanner = new Scanner(System.in);
System.out.println("请输入源码:");
String sourceCode = scanner.nextLine();
// 定义关键词数组
String[] keywordArr = {"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"};
// 遍历源码,计算关键词数量
boolean inComment = false;
boolean inString = false;
int keywordStart = -1;
for (int i = 0; i < sourceCode.length(); i++) {
char c = sourceCode.charAt(i);
// 判断是否在注释中
if (!inString && !inComment && c == '/' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '/') {
break; // 单行注释,后面的代码不需要处理
} else if (!inString && !inComment && c == '/' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '*') {
inComment = true; // 多行注释开始
i++;
continue;
} else if (!inString && inComment && c == '*' && i < sourceCode.length() - 1 && sourceCode.charAt(i + 1) == '/') {
inComment = false; // 多行注释结束
i++;
continue;
}
// 判断是否在字符串中
if (!inComment && !inString && (c == '\'' || c == '\"')) {
inString = true;
} else if (!inComment && inString && c == '\\') {
i++; // 转义字符,后面的字符不需要判断
} else if (!inComment && inString && c == '\"' && sourceCode.charAt(i - 1) != '\\') {
inString = false;
}
// 判断是否在关键词中
if (!inComment && !inString && Character.isJavaIdentifierPart(c)) {
if (keywordStart == -1) {
keywordStart = i;
}
} else {
if (keywordStart != -1) {
String keyword = sourceCode.substring(keywordStart, i);
keywordStart = -1;
if (isKeyword(keyword, keywordArr)) {
int count = keywords.getOrDefault(keyword, 0);
keywords.put(keyword, count + 1);
}
}
}
}
// 输出关键词及其数量
System.out.println("关键词及其数量:");
for (String keyword : keywords.keySet()) {
System.out.println(keyword + ":" + keywords.get(keyword));
}
}
// 判断指定字符串是否为关键词
private static boolean isKeyword(String str, String[] keywordArr) {
for (String keyword : keywordArr) {
if (keyword.equals(str)) {
return true;
}
}
return false;
}
}
```
这段代码中,我们使用了一个状态机的方式,通过判断当前字符是否在注释、字符串、关键词中,来确定当前字符的作用。如果当前字符在注释或字符串中,我们就不处理它;如果当前字符在关键词中,我们就从当前位置开始,找到连续的字符,判断是否为关键词。最后,我们将关键词及其数量存入TreeMap中,并输出结果。
需要注意的是,这段代码仅适用于Java语言中的关键词,如果需要计算其他语言的关键词,需要修改关键词数组。
阅读全文