7-2 12-03统计java关键字的出现的次数 (20 分)

7-2 12-03统计java关键字的出现的次数 (20 分)
统计java源代码中的关键字。如果关键字在注释或者字符串中,则不统计。将java源代码从控制台输入,以新的一行****作为结束行。

输入格式:
java源代码加一行 ****结尾

输出格式:
关键字总数

输入样例:
在这里给出一组输入。例如:

import java.util.*;

public class Exercise21_10 {

}


结尾无空行
输出样例:
在这里给出相应的输出。例如:

keywords:3
结尾无空行


import java.util.*;

 class Flag {
    int quatationFlag = 0;
    int cmtFlag = 0;
    int lineCmtFlag = 0;

    public int getQuatationFlag() {
        return quatationFlag;
    }

    public void setQuatationFlag(int quatationFlag) {
        this.quatationFlag = quatationFlag;
    }

    public int getCmtFlag() {
        return cmtFlag;
    }

    public void setCmtFlag(int cmtFlag) {
        this.cmtFlag = cmtFlag;
    }

    public int getLineCmtFlag() {
        return lineCmtFlag;
    }

    public void setLineCmtFlag(int lineCmtFlag) {
        this.lineCmtFlag = lineCmtFlag;
    }

    public Flag(int quatationFlag, int cmtFlag, int lineCmtFlag) {
        this.quatationFlag = quatationFlag;
        this.cmtFlag = cmtFlag;
        this.lineCmtFlag = lineCmtFlag;
    }
}

 class CntKeyWord {


    
    static String[] keywordString = {"abstract", "finally", "public",
            "boolean", "float", "return", "break", "for", "short", "byte",
            "goto", "static", "case", "if", "super", "catch", "implements",
            "switch", "char", "import", "synchronized", "class",
            "instanceof", "this", "const", "int", "throw", "continue",
            "interface", "throws", "default", "long", "transient", "do",
            "native", "try", "double", "new", "void", "else", "package",
            "volatile", "extends", "private", "while", "final",
            "protected", "true", "null"};

    static void parseSplits(String str, Flag flag, List<String> tokens,
                            Map<String, Integer> map) {
//        if (str.contains("if")) {
//            System.out.println("str");
//            System.out.println(str);
//            System.out.println("quatationFlag");
//            System.out.println(flag.getQuatationFlag());
//            System.out.println("cmtFlag");
//            System.out.println(flag.getCmtFlag());
//            System.out.println("lineCmtFlag");
//            System.out.println(flag.getLineCmtFlag());
//        }

        if (str.equals("\"")) {
            if (flag.getQuatationFlag() == 0) {
//                quatationFlag = 1;
                flag.setQuatationFlag(1);
            } else {
//                quatationFlag = 0;
                flag.setQuatationFlag(0);
//                    可以
//                    if (map.containsKey(str)) {
//                        map.put(str, map.get(str) + 1);
//                    } else {
//                        map.put(str, 1);
//                    }
            }

        } else if (str.equals("/*")) {
//            cmtFlag=1;
            flag.setCmtFlag(1);
//                if (cmtFlag == 0) {
//                    cmtFlag = 1;
//                } else {
//                    cmtFlag = 0;
                    可以
                    if (map.containsKey(str)) {
                        map.put(str, map.get(str) + 1);
                    } else {
                        map.put(str, 1);
                    }
//                }
        } else if (str.equals("*/")) {
//            cmtFlag=0;
            flag.setCmtFlag(0);
//                if (cmtFlag == 0) {
//                    cmtFlag = 1;
//                } else {
//                    cmtFlag = 0;
                    可以
                    if (map.containsKey(str)) {
                        map.put(str, map.get(str) + 1);
                    } else {
                        map.put(str, 1);
                    }
//                }
        } else if (str.equals("//")) {
//            这个if 被 不要了 ,因为有// ,我的算法问题
//            lineCmtFlag=1;
            flag.setLineCmtFlag(1);
//            }else if(str.equals("\n")&&lineCmtFlag==1){
        }
//        else if(str.equals("\n")){
            line 结束了 就 setLineCmtFlag =0 ,但是不是在这里
                回车不会被作为一个 东西读入
            lineCmtFlag=0;
//            flag.setLineCmtFlag(0);
//        }

        if (!tokens.contains(str)) {
            return;
        }
        if (flag.getCmtFlag() == 1 || flag.getQuatationFlag() == 1
                || flag.getLineCmtFlag() == 1) {
//            continue;
            return;
        }
        if (map.containsKey(str)) {
            map.put(str, map.get(str) + 1);
        } else {
            map.put(str, 1);
        }
    }

   static void testSub(){
        String string="line.indexOf(\"//\");";
       int i = string.indexOf("//");
//       System.out.println(string.substring(i));
       System.out.println(string.substring(i+2));
//       ");
   }
    static void parseLine(String line, Map<String, Integer> map, Flag flag,
                          List<String> tokens) {
        int i = line.indexOf("//");
        if (i != -1) {
//            line=line.substring(i+2);
            line=line.substring(0,i);
//            不是 注释后面 而是前面
//            return;
        }
        String[] split = line.split(" ");
        for (String str : split) {
            parseSplits(str, flag, tokens, map);
        }
        flag.setLineCmtFlag(0);

    }

    static  void cntKeyWords(){
        Scanner scanner = new Scanner(System.in);
        Map<String, Integer> map = new HashMap<>();
        List<String> list = Arrays.asList(keywordString);
//        List<String> list = new ArrayList<>(Arrays.asList(keywordString));
//        int quatationFlag = 0;
//        int cmtFlag = 0;
//        int lineCmtFlag = 0;
        Flag flag = new Flag(0, 0, 0);
//        while (scanner.hasNext()) {
        while (scanner.hasNextLine()) {

//            String str = scanner.next();
//            String line = scanner.nextLine();
            String str = scanner.nextLine();
            if (str.equals("****")) {
                break;
            }
            parseLine(str, map, flag, list);
//            if (i == 0) break;

//            if (str.contains("if")) {
//                System.out.println("str");
//                System.out.println(str);
//                System.out.println("quatationFlag");
//                System.out.println(quatationFlag);
//                System.out.println("cmtFlag");
//                System.out.println(cmtFlag);
//                System.out.println("lineCmtFlag");
//                System.out.println(lineCmtFlag);
//            }

//            if(quatationFlag==1||cmtFlag==1){
                "  "  第一个 是 1,碰到第二个 变 0,就可以数数
//                continue;
//            }
//            /*

//            注释开始
//            if (str.equals("\"")) {
//                if (quatationFlag == 0) {
//                    quatationFlag = 1;
//                } else {
//                    quatationFlag = 0;
                    可以
                    if (map.containsKey(str)) {
                        map.put(str, map.get(str) + 1);
                    } else {
                        map.put(str, 1);
                    }
//                }
//
//            } else if (str.equals("/*")) {
//                cmtFlag = 1;
                if (cmtFlag == 0) {
                    cmtFlag = 1;
                } else {
                    cmtFlag = 0;
//                    可以
//                    if (map.containsKey(str)) {
//                        map.put(str, map.get(str) + 1);
//                    } else {
//                        map.put(str, 1);
//                    }
                }
//            } else if (str.equals("*/")) {
//                cmtFlag = 0;
                if (cmtFlag == 0) {
                    cmtFlag = 1;
                } else {
                    cmtFlag = 0;
//                    可以
//                    if (map.containsKey(str)) {
//                        map.put(str, map.get(str) + 1);
//                    } else {
//                        map.put(str, 1);
//                    }
                }
//            } else if (str.equals("//")) {
//                lineCmtFlag = 1;
            }else if(str.equals("\n")&&lineCmtFlag==1){
//            } else if (str.equals("\n")) {
                回车不会被作为一个 东西读入
//                lineCmtFlag = 0;
//            }
//
//            if (!list.contains(str)) {
//                continue;
//            }
//            if (cmtFlag == 1 || quatationFlag == 1 || lineCmtFlag == 1) {
//                continue;
//            }
//            if (map.containsKey(str)) {
//                map.put(str, map.get(str) + 1);
//            } else {
//                map.put(str, 1);
//            }
//            注释结束
        }
//        System.out.println("map");
//        System.out.println(map);
        int cnt=0;
//        map.forEach((k,v)->cnt+=v);
//        https://www.cnblogs.com/bingyimeiling/p/10741761.html
        // 1. entrySet遍历,在键和值都需要时使用(最常用)
        for (Map.Entry<String , Integer> entry : map.entrySet()) {
//            System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
            cnt+=entry.getValue();
        }
//        for()
        System.out.println("keywords:"+cnt);
    }
    public static void main(String[] args) {
//        testSub();
//        //");

        cntKeyWords();
    }
}

class  Main{
    public static void main(String[] args) {
        CntKeyWord.main(args);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值