代码编织梦想

Recursion, Regular Expressions, BNF(Backus-Naur Form grammar) and use of MAP

新开了一门外教课程,Object-oriented Programming(JAVA), 记录一些学习经验,以及部分和c++的区别感悟。
本文主要有三部分:

  1. 递归的interesting point
  2. 正则表达式
  3. BNF grammar
  4. map and set in JAVA的使用,与cpp的相似

Plus. BNF的规则为:< nonterminal symbol >::= < rule > | < rule > | < rule > | … | < rule >
比如:
< adjp >::=< adj >|< adj > < adjp >
< adj >::=big|small|black|wonderful
nonterminal symbol:一种描述语言语法的高级符号,根据语法规则可以将其转化为其他非终端或终端符号
terminal:语言的基本符号

代码即根据用户指定的nonterminal symbol(必须是规定的几种符号,其他符号抛异常)生成sentence。(读取如上述规则以及scanner用户输入的client代码在此文没有给出)

import java.util.*;

public class GrammarSolver {

    private SortedMap<String, String[]> map;
    private Random rand;

    /**
     * building map of non-terminal to rules
     */
    public GrammarSolver(List<String> grammar){
        if(grammar.isEmpty()) { throw new IllegalArgumentException(); }
        
        map = new TreeMap<>();
        for (int i = 0; i < grammar.size(); i++)
        {
            // regex. map of non-terminal to rules
            String line[] = grammar.get(i).split("::=");
            if (map.containsKey(line[0])) { throw new IllegalArgumentException(); }
            String nonterSymbol = line[0];
            // regex. split rules to relu
            String rules[] = line[1].split("[|]");
            map.put(nonterSymbol,rules);
        }
        // use for chose rule.
        rand = new Random();
    }

    public boolean grammarContains(String symbol){
        return map.containsKey(symbol);
    }

    public String[] generate(String symbol,int times){
        if (!grammarContains(symbol) || times <= 0) { throw new IllegalArgumentException(); }

        String[] result = new String[times];
        for (int i = 0; i < times; i++)
        {
            String temp = recursion(symbol).trim();
            result[i] =  temp;
        }
        return result;
    }

    /**
     * recursion to find terminal. The keyidea like DFS but not use the stack.
     */
    private String recursion(String symbol){
        // stop condition
        if (!map.containsKey(symbol)) { return symbol+" "; }

        // chose random rule of rules.
        int equProbNum = this.rand.nextInt(map.get(symbol).length);
        String rule = map.get(symbol)[equProbNum];
        // regex. split space and tab. 
        //Plus. Maybe one rule include many non-terminals or terminals. So ruleList is used
        String ruleList[] = rule.split("[ \t]+");
        // recursion algorithm.
        StringBuilder res = new StringBuilder();
        for (int i =0; i < ruleList.length; i++)
        {
            res.append(recursion(ruleList[i]));
        }
        return res.toString();
    }

    public String getSymbols(){
        return map.keySet().toString();
    }
}
  1. 递归的interesting point
    在c++中,这样的题目更习惯去定义一个void的递归函数,然后用引用的方式去传一个res的字符串,拼接结果。需要注意的是,java中用到了一个新的类需要new出来且初始化,c++中很多时候可以直接在栈空间玩。
    (比如vector< int > myarray; myarray.push_back(6);)
  2. 正则表达式
    一种字符串匹配的方法,比如我们想查找某种模式而不是某种特定字符的字符串。在java中split可以接收regex的参数来分割字符串,比如split("[ \t]+")指分割一个或多个空格orTab。此方法应该我个人理解在模式匹配、检测请求时常用(比如通信时必须按协议的格式发送数据,如果格式不对直接不接收或返回数据格式错误的相应,比如输入密码时当我们不按某种规则输入时会返回格式错误(开头大写,必须包含字母和数字,不能用空格等等规则))
  3. BNF grammar
    语言的语法规则
  4. map and set in JAVA的使用,与C++的相似
    java中的Map接口,有TreeMap和HashMap等的实现方式。使用对标c++STL中map和unordered_map。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_40550384/article/details/111059496

下一代AI的创纪录低能耗的人工视觉系统-爱代码爱编程

一项联合研究建立了一个超低功耗的人工视觉系统来模仿人脑,该系统成功执行了数据密集型认知任务。他们的实验结果可以为下一代人工智能(AI)应用提供有希望的设备系统。 研究小组由城大材料科学与工程学系副主任兼教授何国贤教授领导。他们的发现发表在科学杂志《科学进展》上,标题为“由氧化物超晶格纳米线中的准二维电子气激活的人工视觉系统”。 随着用于数字计算的半导体

@Lazy原理/源码解析,如何解决Spring不能解决的循环依赖-爱代码爱编程

目录 @Lazy作用作用解决问题举例@Lazy使用@Lazy原理位置被Spring源码使用处ContextAnnotationAutowireCandidateResolver参与循环依赖解决getLazyResolutionProxyIfNecessarybuildLazyResolutionProxy创建 “虚假的”代理总结 @Lazy作用

“数据类型不一致: 应为 NUMBER, 但却获得 BINARY”解决方法-爱代码爱编程

  昨天用JPA写报表的SQL,在执行的时候一直报 “数据类型不一致: 应为 NUMBER, 但却获得 BINARY” 的错误,一开始我还不知道Oracle的数据类型和Java对应类型有所不同,逐行检查我的SQL,查看是哪段类型出了问题。   后面检查发现是下面这行语句出现了问题。 AND (ro.is_included_commission = ?35

Netty设计模式与源码分析(一)-爱代码爱编程

Netty设计模式与源码分析 大名鼎鼎的Reactor模式Reactor模式的组成元素Reactor模式的三步曲Netty中的Reactor模式EventLoopGroup、EventLoop总结Netty 中的 Future、PromiseFutureChannelFuturePromise 接口ChannelPromise 大名鼎鼎的Rea

【工业化面试】之设计模式-爱代码爱编程

前言 设计模式是后端开发(主要指java开发)面试中必不可少的考察内容之一,但是设计模式总共有23种之多,全部掌握需要很长时间,本文从面试的角度出发,总结了以下几个常考的设计模式(面试官通常会问我们了解哪些设计模式,这时候就是我们自由发挥的时间,讲好了会加分)。 正文 1、 单例模式 确保每个类只有一个实例,并提供公共接口供全局访问。主

六个月的校招终于告一段落,不说进大厂,也算进了自己满意的公司,说一下自己的面试经验吧!-爱代码爱编程

前言 本人双非野鸡大学,春招0offer是真的菜(准备晚了),秋招最后拿到了绿盟的offer,今天签约基本结束了这六个月的校招。感谢学长一直以来的帮助。虽然不像各位大佬一堆offer但还是想纪录一下,校招真的累 双非今年是真的难,本身也菜再加上学历不行刚开始的时候是真的被整自闭了。 总结下这六个月面试以及心态吧。 秋招: 我这里准备了一线大厂面试资

python 爬虫 30行代码带你爬取酷狗音乐的歌曲内容-爱代码爱编程

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/12/12 10:00 # @Author : huni # @File : 酷狗音乐.py # @Software: PyCharm import requests import warnings import js

模糊查询——MongoDB-爱代码爱编程

MongoDB的模糊查询是使用正则匹配实现:关键操作符**$regex** 1.MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。 2.MongoDB使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。 当要实现MongoDB的document中某字段内容模糊查询时,可以在

Apache Struts 修复 OGNL 技术中可能存在的 RCE 缺陷-爱代码爱编程

 聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Apache 软件基金会发布 Struts 2 安全更新,修复了一个和 OGNL 技术相关的“很可能存在的远程代码执行“缺陷。 Apache Struts 作为开源的 MVC Web 应用框架,可使开发人员构建 Java 应用,一直以来受到多个严重漏洞的影响,而其中很多漏洞和

Python 基础篇+提高篇+笔记-爱代码爱编程

01第零回(免费预览)莫叹琐事催白发,且学Python省年华.mp4 02第一回(免费预览)梧桐长成鸾凤至,环境搭好代码来.mp4 03第二回(免费预览)算术符号遵循惯例,版本差异务必当心.mp4 04第三回(免费预览)单条语句独占单行代码,多种函数分属多个模块.mp 05第四回:变量命名须知种种惯例,数据存储要靠层层关联.mp4 06第五回:文章无非字符

剑指Offer 19. 正则表达式匹配(Hard)-爱代码爱编程

44. 通配符匹配(Hard)【题目链接】题解 正则表达式匹配(动态规划,清晰图解)字节题库 - #剑19 - 困难 - 正则表达式匹配思路 代码 class Solution: ### 1211 动态规划(68 ms,14.8 MB) def isMatch(self, s: str, p: str) -> bool:

Python爬虫:短视频平台无水印下载!强不强?-爱代码爱编程

导入: 虽然目前有些软件还没适配,但是,我发了 Blink 后有一写人留言或者私信找我要源码,不过我还在增加适配的软件,所以还没有时间写这篇博客,今天呢,就先把我目前适配了的代码拿出来,后续还会继续适配的! 分平台解释: 皮皮虾 皮皮搞笑 皮皮搞笑与皮皮虾很类似,也是先获取分享链接,在电脑端进行分析: PS:如有需要Python学习资料的小伙伴