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