R7-9 Java プログラム内のキーワードの出現をカウントする

入力 Java ソース コード内のキーワード (大文字と小文字を区別) の出現をカウントするプログラムを作成します。次のように説明されています。

  • Java には 53 のキーワードがあります (Baidu による)
  • キーボードからソース コードを入力し、このソース コードに出現するキーワードの数を数えます。
  • コメントに含まれるキーワードはカウントされません
  • 文字列内に出現するキーワードはカウントされません
  • 集計されたキーワードと数量をキーワードの昇順にソートして出力します。
  • ソースコードが入力されていない場合、入力は不正とみなされます。

入力形式:

Java ソース コード文字列を 1 行以上入力し、そのexit行を終了マークとして入力します。

出力フォーマット:

  • ソースコードが入力されていない場合、プログラムは次のように出力します。Wrong Format
  • 統計情報がない場合、出力は空になります。
  • 統計データがある場合は、キーワードを昇順に並べ、各行にキーワードとその個数を の形式で出力します。数量\t关键字

入力サンプル:

一連の入力がここに与えられます。例えば:

//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit

出力例:

対応する出力をここに示します。例えば:

1	float
3	if
2	int
2	new
2	public
3	this
2	throw
// 双指针算法+HashMap+TreeMap+正则表达式
import java.util.*;
public class Main {
    public static boolean check( char x) {
        if((x>='a'&&x<='z') || (x>='A'&&x<='Z')) return true;
        else return false;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashMap<String,Integer> map = new HashMap<>();
        TreeMap<String,Integer> res = new TreeMap<>();
        String str[] = {"abstract","assert","boolean","break","byte","case","catch","char","class","continue","default","do","double","else","enum","extends","final","finally","float","for","if","implements","import","int","interface","instanceof","long","native","new","package","private","protected","public","return","short","static","strictfp","super","switch","synchronized","this","throw","throws","transient","try","void","volatile","while","goto","const","true","false","null"};
        for(int i=0; i<53; i++) map.put( str[i], 0);
        boolean F = true;
        while(sc.hasNext()) {
            String s1 = sc.nextLine();
            StringBuffer s = new StringBuffer();
            if(s1.equals("exit")) break;
            F = false;
            s.append(s1.replaceAll("\".*\"","").replaceAll("//.*","")); //运用正则表达式去除//注释的和双引号里的内容
            if(s.indexOf("/*")!=-1) { //删除/* */ 注释的
                if(s.indexOf("*/")!=-1) s.delete( s.indexOf("/*"), s.indexOf("*/")+2); // /* */注释没有跨行
                else { // /* */跨行
                    s.delete( s.indexOf("/*"), s.length());
                    while(sc.hasNext()) { //一直输入知道出现 */
                        String sr = sc.nextLine();
                        if(sr.indexOf("*/")!=-1) {
                            s.append( sr.substring(sr.indexOf("*/")+2));
                            break;
                        }
                    }
                }
            }
            String sr = s.toString();
		    sr = sr.replace("=", "a"); //测试点2
            int l = sr.length();
            for(int i=0; i<l; i++) { //运用双指针扫描,把每个词提取出来
                while(i<l && check( sr.charAt(i) ) == false) i++;
                int j = i;
                while(j<l && check( sr.charAt(j) ) == true) j++;
                if(i < l) {
                    String r = sr.substring( i, j); //把扫描出来的单词提前出来
                    if(map.containsKey(r) == true ) { //判断是否是关键词
                        if(res.containsKey(r) == false) res.put( r, 1);
                        else res.replace( r, (res.get(r)+1));
                    }
                }
                i = j;
            }
        }
        if( F ) System.out.println("Wrong Format");
        else if(res.size()!=0){
            for(String i: res.keySet())
                System.out.println(res.get(i) + "\t" + i);
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_51936803/article/details/124752047