统计Java源代码中关键字的数目(每个关键字的数目)
題目要求:編寫一個程序,讀取一個java源代碼文件(.java),然后報告該文件中關鍵字的個數。從命令行傳遞這個java源文件。
以下代碼從IDEA中的程序運行參數中傳入 任意文件或目錄的絕對路徑,此步驟等價于“從命令行傳遞任意文件或目錄”的絕對路徑。
若是目錄則獲取目錄下的所有子文件或子目錄的絕對路徑遞歸調用該方法,對.java文件和子目錄中.java進行統計;
若是.java文件則直接統計。
此外以下程序使用了與java源代碼在相同文件夾下存儲Java所有關鍵字的文本文件(.txt)。
代碼使用HashMap<String,Integer>存儲所有關鍵字及其個數,檢索效率較高。
可以檢索格式化(規范)的代碼(這里指類似于IDEA中經過 Ctrl+Alt+L 格式化的代碼)
分析:經過格式化(規范)的代碼后,大部分Java關鍵字都在代碼中處于 "? ? 關鍵字? ? "(關鍵字兩邊都是空格)的情況。
但有些較特殊的情況,需要我們特殊處理,例如:
while (true) {// (true) true關鍵字if (條件) {break;}} continue; super.方法名(參數); this.方法名(參數);這幾種情況,格式化(規范)代碼后,關鍵字不是“獨立”的存在而是與其他字符“連”在一起。
另外類似:
System.out.println("private public protected..."); //字符串中存在關鍵字不應該被統計在內。?
代碼:
package count;import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Scanner; import java.util.Set;public class CountKeywords {private static HashMap<String, Integer> records = new HashMap<>();//用于存儲關鍵字/*** 獲取關鍵字*/private static void getKeywords() {/**在程序中,不要直接使用絕對文件名。如果使用了像 c:\\book\\Welcome.java 之類的文*件名,那么它能在 Windows上工作,但是不能在其他平臺上工作。應該使用與當前目錄相* 關的文件名。例如,可以使用 new File("welcome.java")為在當前目錄下的文件 Welcome.java* 創建一個 File 對象。可以使用 new File("image/us.gif")為在當前目錄下的 image目* 錄下的文件 us.gif創建一個 File 對象。斜杠(/)是 Java 的目錄分隔符,這點和 UNIX 是一樣的。* 語句 new File(image/us.gif")在 Windows、UNIX 或任何其他系統上都能工作。*/File file = new File("src/count/keywords.txt");//通過存儲關鍵字的文本文件獲取關鍵字并存儲if (!file.exists()) {System.err.println("Keywords-file does not exist!");System.exit(0);}try (Scanner scanner = new Scanner(file)) {while (scanner.hasNext()) {records.put(scanner.next(), 0);}} catch (FileNotFoundException e) {e.printStackTrace();}}static {getKeywords();}public static void main(String[] args) {File file = new File(args[0]);if (!file.exists()) {//對輸入的“命令行”路徑參數進行檢驗System.err.println("File or directory does not exist!");System.exit(0);} else {checkAndCountFromFile(args[0]);}Set<String> keywordsSet = records.keySet();for (String keyword : keywordsSet) {//遍歷統計的各個關鍵字的結果System.out.println(keyword + " : " + records.get(keyword));}}/*** 統計.java文件中各個關鍵字的個數* 若是目錄則獲取目錄下的所有子文件或子目錄的絕對路徑遞歸調用該方法,對.java文件和子目錄中.java進行統計* 若是.java文件則直接統計** @param path 文件或目錄的絕對路徑*/private static void checkAndCountFromFile(String path) {File[] files;File file = new File(path);if (file.isDirectory()) {//若是目錄則獲取目錄下的所有子文件或子目錄的絕對路徑遞歸調用該方法,對.java文件和子目錄中.java進行統計files = file.listFiles();for (int i = 0; i < files.length; i++) {checkAndCountFromFile(files[i].getAbsolutePath());}} else if (file.isFile()) {//若是.java文件則直接統計if (file.getName().endsWith(".java")) {try (Scanner scanner = new Scanner(file)) {while (scanner.hasNext()) {checkAndCountFromStr(scanner.next());}} catch (FileNotFoundException e) {e.printStackTrace();}}}}/*** 檢查從Java源文件中逐個讀取的字符串并且對關鍵字逐個統計數目** @param string 從Java源文件中逐個讀取的字符串*/private static void checkAndCountFromStr(String string) {if (records.containsKey(string)) records.put(string, records.get(string) + 1);switch (string) {case "(true)":records.put("true", records.get("true") + 1);break;case "break;":records.put("break", records.get("break") + 1);break;case "continue;":records.put("continue", records.get("continue") + 1);break;}if (string.length() > 6) {if (string.substring(0, 6).equals("super.")) records.put("super", records.get("super") + 1);if (string.substring(0, 5).equals("this.")) records.put("this", records.get("super") + 1);}} }執行結果:
? ? ??? ?
該程序在處理以下情況時不能準確統計Java源文件中各個關鍵字的個數:
// 關鍵字 關鍵字 關鍵字 ...單行注釋中存在“間斷”的關鍵字情況。
/** * 關鍵字 關鍵字 * 關鍵字 關鍵字 關鍵字 */多行注釋或文檔注釋中存在“間斷”的關鍵字情況。
String str = "關鍵字 關鍵字"; System.out.println(" 關鍵字 關鍵字");字符串中存在“間斷”的關鍵字情況。
如果想要處理以上三種情況,可以使用正則表達式結合字符串的相關處理方法進行解決。
若有錯誤還請斧正。
總結
以上是生活随笔為你收集整理的统计Java源代码中关键字的数目(每个关键字的数目)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1551):补充cloak
- 下一篇: visual studio编Java,如